#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
и получения их оттуда между обратными отправками