输入不会保存在Gridview行更新事件中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了输入不会保存在Gridview行更新事件中相关的知识,希望对你有一定的参考价值。

我知道之前已经问过这个问题,但是我已经尝试过那些帖子中的解决方案,但没有任何工作。

我有一个gridview,它是一个XML文件填充的,并且意味着要更新它。由于此gridview所在页面的用途,数据绑定发生在page_load事件上。此外,我正在使用TemplateFields来控制gridview的布局。

这是我的代码。首先,Gridview:

<asp:GridView ID="fileGrid" runat="server" EnableViewState="true" AutoGenerateColumns="False" Width="315px" BorderStyle="None" 
OnRowDeleting="fileGrid_RowDeleting" OnRowEditing="fileGrid_RowEditing" 
OnRowCancelingEdit="fileGrid_RowCancelingEdit" OnRowUpdating="fileGrid_RowUpdating"
 OnRowDataBound="fileGrid_RowDataBound">
<Columns>
    <asp:BoundField DataField="name" HeaderText="Uploaded Files" SortExpression="name" ReadOnly="true">
        <ItemStyle CssClass="fileName" />
    </asp:BoundField>
    <asp:TemplateField HeaderText="Description">
        <ItemStyle CssClass="desc-cell" />
        <ItemTemplate>
            <asp:Label ID="Label1" runat="server" Text='<%# Bind("desc") %>'></asp:Label>
        </ItemTemplate>
        <EditItemTemplate>
            <asp:TextBox ID="descTb" runat="server" Text='<%# Bind("desc") %>'></asp:TextBox>
        </EditItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField>
        <ItemStyle CssClass="cmdCell" />
        <ItemTemplate>
            <asp:LinkButton ID="lnkEdit" runat="server"  CommandName="Edit">Edit</asp:LinkButton>                            
        </ItemTemplate>
        <EditItemTemplate>
            <asp:LinkButton ID="lnkUpdate" runat="server" CommandName="Update">Update</asp:LinkButton>
        </EditItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField>
        <ItemStyle CssClass="cmdCell" />
        <ItemTemplate>
            <asp:LinkButton ID="lnkDelete" runat="server" CommandName="Delete">Delete</asp:LinkButton>
        </ItemTemplate>
        <EditItemTemplate>
            <asp:LinkButton ID="lnkCancel" runat="server" CommandName="Cancel">Cancel</asp:LinkButton>
        </EditItemTemplate>
    </asp:TemplateField>
</Columns>

还有我的OnRowUpdating功能。这是问题发生的地方:

protected void fileGrid_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    int eRow = e.RowIndex;
    GridViewRow row = fileGrid.Rows[eRow];

    string name = row.Cells[0].Text;
    string desc = ((TextBox)(row.Cells[1].FindControl("descTb"))).Text;

    // Update XML via Linq-to-XML here
}

但是,我无法捕获输入到descTb文本框中的值; “desc”总是回来无效。我知道在RowUpdating之前会触发page_load,但是我无法在PostBack检查中包含填充我的gridview的代码,因为那时我的gridview变回空白(我仍然没有得到那个血腥的文本框值。)保存初始,在会话内存中预编辑网格视图数据并更新RowUpdating事件中的数据不起作用。将文本框控件上的EnableViewState设置为“true”,并删除text属性中的<%#Bind()%>不起作用。

有没有人有任何想法?

答案

由于无需在RowUpdating事件中获得单独的GridViewRow,您可以像使用GridView.Rows[e.RowIndex].FindControl一样:

string desc = ((TextBox)(fillGrid.Rows[e.RowIndex].FindControl("descTb"))).Text;

更新:这是一些可以帮助您的逻辑代码:

protected void Page_Load(object sender, EventArgs e)
{
    fillGrid.DataSource = table;

    if(!IsPostBack)
        fillGrid.DataBind();
}
protected void fillGrid_RowEditing(object sender, GridViewEditEventArgs e)
{
    fillGrid.EditIndex = e.NewEditIndex;
    fillGrid.DataBind();
}       

protected void fillGrid_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    string desc = ((TextBox)(fillGrid.Rows[e.RowIndex].FindControl("descTb"))).Text;
}

以上是关于输入不会保存在Gridview行更新事件中的主要内容,如果未能解决你的问题,请参考以下文章

ASP .NET - 在 GridView 中更新之前保存现有数据的副本

如何在不将数据保存到数据库的情况下更新 Gridview 行

如何通过单击适配器类中代码的项目中的删除按钮来删除列表视图中的项目后重新加载片段?

GridView 行编辑事件的基础问题

如何测量python中代码行之间的时间?

统计代码中代码行空行注释行的个数