Как сохранить данные gridview при обратной передаче?

1

У меня есть данные в виде сетки. А также я написал код внутри Row Data Bound для изменения URL-адреса изображения на изображение.

Вот код:

protected void GridView1_RowDataBound(object sender, System.Web.UI.WebControls.GridViewRowEventArgs e)

 {
    for (int i = 1; i < e.Row.Cells.Count; i++)
    {
      string cellValue = e.Row.Cells[i].Text.Trim();
      if(cellValue.StartsWith("http:"))
      {
           System.Web.UI.WebControls.Image img = new System.Web.UI.WebControls.Image();
           img.ImageUrl = e.Row.Cells[i].Text.Trim();
           HyperLink hb = new HyperLink();
           hb.Controls.Add(img);
           e.Row.Cells[i].Controls.Add(hb);
     }
    }        
 }

Он работает нормально. На странице есть еще два элемента управления. Если я выберу один элемент управления вниз, я сделал сообщение назад. В то время изображение внутри меня уже было изменено на URL вместо Image.

Можете ли вы помочь мне справиться?

Заранее спасибо.

Вот мой код для проблем (я не могу опубликовать весь код)

Код aspx:

 <html>
 <body>

 <form id="form1" runat="server">

 <asp:DropDownList ID="DropDownList2" CssClass="borderradius" runat="server" Height="20px" Width="190px" AutoPostBack="True" OnSelectedIndexChanged="DropDownList2_SelectedIndexChanged" Font-Size="11px">

 </asp:DropDownList> 

 <asp:Button id="sidesbmt" runat="server" onclick="sidesbmt_click"/>                    
 <asp:GridView ID="GridView1" runat="server" Width="100%" CssClass="mGrid" PagerStyle-CssClass="pgr"

AlternatingRowStyle-CssClass="alt" OnRowDataBound="GridView1_RowDataBound" OnSelectedIndexChanged="GridView1_SelectedIndexChanged"

BorderStyle="None" GridLines="Both">

<AlternatingRowStyle CssClass="alt"></AlternatingRowStyle>

  </asp:GridView>
</body>
 </html>

Код за

 protected void Page_Load(object sender, EventArgs e)

 {
 }
 protected void sidesbmt_Click(object sender, EventArgs e)

{
  GridView1.DataSource = ds;

  GridView1.DataBind();
}

protected void GridView1_RowDataBound(object sender, System.Web.UI.WebControls.GridViewRowEventArgs e)

 {
     for (int i = 1; i < e.Row.Cells.Count; i++)
     {
        string cellValue = e.Row.Cells[i].Text.Trim();
        if(cellValue.StartsWith("http:"))
        {
            System.Web.UI.WebControls.Image img = new System.Web.UI.WebControls.Image();
            img.ImageUrl = e.Row.Cells[i].Text.Trim();
            HyperLink hb = new HyperLink();
            hb.Controls.Add(img);
            e.Row.Cells[i].Controls.Add(hb);
        }
     }        
 }
  • 0
    Что у вас на странице загружается? Добавьте if (! IsPostback) {...} в загрузку вашей страницы
  • 0
    Я написал привязку данных внутри нажатия кнопки, а не загрузки страницы .....
Показать ещё 1 комментарий
Теги:
gridview

1 ответ

3
Лучший ответ

Эта проблема возникает, когда вы добавляете элементы управления динамически, и этот элемент управления не существует во время события Page Init. Чтобы восстановить состояние представления в элементе управления после обратной передачи, элемент управления должен присутствовать в дереве управления.

Вы можете попробовать немного изменить код. Преобразуйте столбец, который отображает изображение и URL-адрес в поле шаблона

<asp:TemplateField>
    <ItemTemplate>
        <asp:Literal runat="server" ID="literalUrl" Text='<%#Eval("The fieldname")%>'></asp:Literal>
        <asp:Image runat="server" ID="imageUrl" Visible="false" />
    </ItemTemplate>
</asp:TemplateField>

Затем в событии rowdatabound переключается представление изображения и литерала

protected void GridView1_RowDataBound(object sender, System.Web.UI.WebControls.GridViewRowEventArgs e)
{
    for (int i = 1; i < e.Row.Cells.Count; i++)
    {
        string cellValue = e.Row.Cells[i].Text.Trim();
        Literal literal = e.Row.Cells[i].FindControl("literalUrl") as Literal;
        Image imageUrl = e.Row.Cells[i].FindControl("imageUrl") as Image;
        if (literal != null && imageUrl != null)
        {
            if (literal.Text.StartsWith("http:"))
            {
                imageUrl.ImageUrl = literal.Text.Trim();
                imageUrl.Viisible = true;
                literal.Visible = false;
            }
        }
    }
}
  • 0
    Отлично ... Большое спасибо ... Я понял ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню