我有一个附有gridview的列,它允许用户将数据输入到文本框中。

当用户在任何文本框中输入/输入数据,然后如果他更改了页面索引,然后又返回到旧页面,则在文本框中输入的数据将丢失。

所以有什么办法可以保持我在文本框中输入的值/数据eventhogh用户可以通过更改网格视图的页面索引来访问其他页面?

<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数据,并且由于ASP.NET页面生命周期,DataItemTemplate内部的所有编辑器此后都会丢失其值。因此,您需要通过处理相应控件的Session处理程序(如果带Init的列是CustomUnboundColumnData的话,也使用DataItemTemplate处理程序),将文本框值存储在项目模板内的另一种方法,例如隐藏字段或DataItemTemplate状态变量。未绑定的列)。

如果您想使用隐藏字段(我认为这是最简单的方法),请像下面这样放置一个隐藏字段:

<dx:ASPxHiddenField ID="hiddenField" runat="server" ClientInstanceName="hf"></dx:ASPxHiddenField>


然后,更新后面的标记和代码,以使Init中的文本框通过处理ValueChangedTextChanged(或)事件在服务器端和客户端中具有事件处理程序,该事件存储文本框值并设置其值回调后:

标记

<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
}


相关话题:


Values of ASPxTextBox placed in the DataItemTemplate are lost after grouping
How to store the values of ASPxTextBoxes inside DataItemTemplate during paging
How to bind ASPxGridView based on other grid's Selection and its UnboundColumn data
The general technique of using the Init/Load event handler

关于c# - 分页期间如何在DevExpress GridView DataItemTemplate内部存储ASPxTextBoxes的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49857557/

10-13 03:16