c# - 如何在分页期间将 ASPxTextBoxes 的值存储在 DevExpress GridView DataItemTemplate 中

标签 c# asp.net gridview devexpress

我有一个 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/

相关文章:

c# - 多种数据格式字符串的通用正则表达式

c# - 使用 C# 安装 Msmq

asp.net - 如何从 IHttpResponse 获取响应 header

c# - 将 id 值传递给 gridview 控件中的 LinkBut​​ton 服务器端事件

可编辑所有记录的 ASP.NET Gridview

android - 将 Grid View 添加到 ScrollView 时的额外空间

c# - 如何在 C# 中的 foreach 循环中使用多线程

c# - 为 List<Enum> 构建通用方法

asp.net - jQuery AJAX 在 Firefox 中慢,在 IE 中快

c# - 使用 HTML5 捕获签名并将其作为图像保存到数据库