Данные ASP.NET GridView, которые я устанавливаю для события RowDatabound, теряются после обратной отправки. - PullRequest
1 голос
/ 15 октября 2011

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

Это мой код

<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 =="&nbsp;"))
        {
            e.Row.Cells[4].Text = "";   
        }
  }

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

До обратной передачи

enter image description here

После обратной передачи

enter image description here

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

Ответы [ 2 ]

4 голосов
/ 15 октября 2011

Проблема состоит в том, что вы устанавливаете текст ячейки таблицы 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 == "&nbsp;"))
    {
        RadioButtonList radioList = (RadioButtonList)e.Row.FindControl("radioList");
        radioList.Visible = false;
    }
}

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

1 голос
/ 15 октября 2011

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

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

ViewState["GridviewData"] = GridviewData

и получить их оттуда между постбэками

...