ASP.NET Данные GridView, которые я устанавливаю в событии RowDataBound, теряются после отправки обратно

#asp.net #gridview #postback #viewstate

#asp.net #gridview #обратная отправка #viewstate

Вопрос:

У меня есть asp.net страница, где у меня есть элемент управления gridview, который связывает данные из DataTable. В моем 5-м столбце сетки я показываю список переключателей, в котором есть 2 элемента переключателей (да или нет). Для некоторых строк я не буду показывать элемент управления RadioButton, если значение ячейки 4-го столбца пустое. Все работает нормально.Но в моем событии нажатия кнопки (обратная передача) в сетке отображается список переключателей для тех ячеек, которые не были показаны изначально. Я включил ViewState для страницы и элемента управления

Это мой код

 <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns=false 
                             DataKeyNames="RequestDetailId" ondatabound="GridView1_DataBound"  EnableViewState ="true" AllowPaging=false
                             onrowdatabound="GridView1_RowDataBound">
       <Columns>
           <asp:BoundField DataField="RequestDetailId" HeaderText="Request Detail Id" />
           <asp:BoundField DataField="Item" HeaderText="Item" />
           <asp:BoundField DataField="Status" HeaderText="Status" />
           <asp:BoundField DataField="NewOffer" HeaderText="New Offer" />
           <asp:TemplateField HeaderText="Your Response" ItemStyle-CssClass="radioTD">
               <ItemTemplate>
                   <asp:RadioButtonList ID="radioList" runat="server">
                        <asp:ListItem Text="Yes" Value="Accept"></asp:ListItem>
                        <asp:ListItem Text="No" Value="Reject"></asp:ListItem>
                    </asp:RadioButtonList>

                 </ItemTemplate>
            </asp:TemplateField>
       </Columns>                    
 </asp:GridView>
  

в коде позади

  protected void Page_Load(object sender, EventArgs e)
 {
        if (!IsPostBack)
        {
           LoadItemDetails();
        }
  }

 private void LoadItemDetails()
 {
     DataTable objDt=  GetGridDataSource();
       if (objDt.Rows.Count > 0)
       {                     
                  GridView1.DataSource = objDt;
                  GridView1.DataBind(); 
        }
 }
 protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
 {          
        if(String.IsNullOrEmpty (e.Row.Cells[3].Text.Trim())||(e.Row.Cells [3].Text =="amp;nbsp;"))
        {
            e.Row.Cells[4].Text = "";   
        }
  }
  

Мои результаты

Перед обратной отправкой

введите описание изображения здесь

После обратной отправки

введите описание изображения здесь

Как мне сохранить содержимое после обратной отправки? Спасибо

Ответ №1:

Проблема в том, что вы устанавливаете текст ячейки таблицы GridView в пустую строку, а не устанавливаете видимость элемента управления RadioButtonList в false.

Очистка свойства Text удаляет разметку для RadioButtonList при первой загрузке, но при обратной передаче событие RowDataBound не запускается, а элемент управления RadioButtonList воссоздается и отображается снова.

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

Попробуйте следующее:

 protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (String.IsNullOrEmpty(e.Row.Cells[3].Text.Trim()) || (e.Row.Cells[3].Text == "amp;nbsp;"))
    {
        RadioButtonList radioList = (RadioButtonList)e.Row.FindControl("radioList");
        radioList.Visible = false;
    }
}
  

Надеюсь, это поможет.

Ответ №2:

вы можете сделать что-то вроде этого..

из описания проблемы. звучит так, как будто вы выполняете привязку данных в коде. в таком случае asp.net не сохраняет источник данных в viewstate для вас. попробуйте извлечь данные и сохранить их в объекте ViewState hashtable с помощью чего-то вроде

 ViewState["GridviewData"] = GridviewData
  

и получения их оттуда между обратными отправками