我有一个 GridView ,我附加了一些列,允许用户将数据输入到文本框中。
当用户在任何文本框中输入/输入数据,然后如果他更改页面索引,然后返回旧页面时,在文本框中输入的数据就会丢失。
有什么方法可以让我保持在文本框中输入的值/数据,即使用户可以通过更改 GridView 的页面索引来访问不同的页面?
<dx:ASPxGridView EnablePagingGestures="True" SettingsPager-PageSize="5" ID="grdSelectedItem" runat="server" OnPageIndexChanged="grdSelectedItem_PageIndexChanged" AutoGenerateColumns="False" KeyFieldName="ProductID">
<Columns>
<dx:GridViewDataTextColumn FieldName="Title" Caption="Product Tittle" Settings-AllowAutoFilter="False">
</dx:GridViewDataTextColumn>
<dx:GridViewDataTextColumn FieldName="CountItem" Caption="Count Items" Settings-AllowAutoFilter="False" Width="75px">
<DataItemTemplate>
<asp:TextBox runat="server" ID="txtCountItem" Text='<%# Eval("CountItem") %>'></asp:TextBox>
</DataItemTemplate>
</dx:GridViewDataTextColumn>
</Columns>
</dx:ASPxGridView>
最佳答案
出现此问题的原因是分页(也包括排序和分组)更新 ASPxGridView
带有回调的数据发送到服务器,以及 DataItemTemplate
内的所有编辑器之后由于 ASP.NET 页面生命周期而失去其值(value)。因此,您需要另一种方式来存储项目模板内的文本框值,例如隐藏字段或 Session
通过处理Init
来处理状态变量相应控件的处理程序(如果带有 CustomUnboundColumnData
的列是未绑定(bind)列,则也使用 DataItemTemplate
处理程序)。
如果你想使用隐藏字段(我认为这是最简单的方法),请像这样放置一个隐藏字段:
<dx:ASPxHiddenField ID="hiddenField" runat="server" ClientInstanceName="hf"></dx:ASPxHiddenField>
然后,更新后面的标记和代码,以便 DataItemTemplate
内的文本框通过处理 Init
在服务器端和客户端都有事件处理程序和ValueChanged
(或 TextChanged
)事件,存储文本框值并在回调后设置其值:
标记
<script>
function grdSelectedItem_Init(s, e) {
if (hf.Contains(s.cpHFKey))
s.SetValue(hf.Get(s.cpHFKey));
}
function grdSelectedItem_ValueChanged(s, e) {
hf.Set(s.cpHFKey, s.GetValue());
}
</script>
<!-- other stuff -->
<dx:ASPxGridView EnablePagingGestures="True" SettingsPager-PageSize="5" ID="grdSelectedItem" runat="server" OnPageIndexChanged="grdSelectedItem_PageIndexChanged" AutoGenerateColumns="False" KeyFieldName="ProductID">
<Columns>
<dx:GridViewDataTextColumn FieldName="Title" Caption="Product Tittle" Settings-AllowAutoFilter="False">
</dx:GridViewDataTextColumn>
<dx:GridViewDataTextColumn FieldName="CountItem" Caption="Count Items" Settings-AllowAutoFilter="False" Width="75px">
<DataItemTemplate>
<dx:ASPxTextBox ID="txtCountItem" runat="server" Text='<%# Eval("CountItem") %>' OnInit="txtCountItem_Init">
<ClientSideEvents Init="grdSelectedItem_Init" ValueChanged="grdSelectedItem_ValueChanged" />
</dx:ASPxTextBox>
</DataItemTemplate>
</dx:GridViewDataTextColumn>
</Columns>
</dx:ASPxGridView>
隐藏代码
protected void txtCountItem_Init(object sender, EventArgs e)
{
ASPxTextBox textBox = sender as ASPxTextBox;
GridViewDataItemTemplateContainer container = textBox.NamingContainer as GridViewDataItemTemplateContainer;
textBox.JSProperties["cpHFKey"] = String.Format("{0}_txtCountItem_{1}", container.Grid.ClientID, container.KeyValue);
textBox.ClientIDMode = ClientIDMode.Static;
// other stuff
}
相关主题:
关于c# - 如何在分页期间将 ASPxTextBoxes 的值存储在 DevExpress GridView DataItemTemplate 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49857557/