【问题标题】:Why does GridView Rowupdating event not capture the new values of textbox?为什么 GridView Rowupdating 事件不捕获文本框的新值?
【发布时间】:2011-07-11 13:40:35
【问题描述】:

我正在使用网格视图。当我单击编辑按钮时,会出现更新和取消按钮。 在修改来自 EditItemTemplate 的文本框中的值后,新值不会显示在事件处理程序 rowupdating() 中,而是我得到呈现页面时出现的值。如何从这些文本框中获取新值并继续进行? 这是代码。

<asp:GridView ID="GridView1" runat="server" AutoGenerateEditButton="true" AutoGenerateColumns="false" 
        AutoGenerateDeleteButton="true" onrowediting="GridView1_RowEditing" 
        onrowupdating="GridView1_RowUpdating">
    <Columns>


    <asp:TemplateField>
    <ItemTemplate>
        <asp:Label ID="lblId" runat="server" Text='<%# Eval("id") %>'></asp:Label>
    </ItemTemplate>
    <EditItemTemplate>
        <asp:TextBox ID="txtId" runat="server" Text='<%# Eval("id") %>'></asp:TextBox>
    </EditItemTemplate>
    </asp:TemplateField>

    <asp:TemplateField>
    <ItemTemplate>
        <asp:Label ID="lblName" runat="server" Text='<%# Eval("cpuname") %>'></asp:Label>
    </ItemTemplate>
    <EditItemTemplate>
        <asp:TextBox ID="txtName" runat="server" Text='<%# Eval("cpuname") %>'></asp:TextBox>
    </EditItemTemplate>
    </asp:TemplateField>

    <asp:TemplateField>
    <ItemTemplate>
        <asp:Label ID="lblStatus" runat="server" Text='<%# Eval("status") %>'></asp:Label>
    </ItemTemplate>
    <EditItemTemplate> 
      <asp:TextBox ID="txtStatus" runat="server" Text='<%# Eval("status") %>'></asp:TextBox>
     </EditItemTemplate>
    </asp:TemplateField>

    </Columns>


</asp:GridView>


protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
        {
            GridView1.EditIndex = e.NewEditIndex;
        }

        protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
            TextBox text = (TextBox)GridView1.Rows[e.RowIndex].FindControl("txtName");
        }

【问题讨论】:

  • if(!IsPostBack) BindDataGrid() 工作正常

标签: asp.net .net gridview


【解决方案1】:

您应该在这里使用双向绑定。 IE。绑定而不是 Eval:

<asp:TextBox ID="txtId" runat="server" Text='<%# Bind("id") %>'></asp:TextBox>

这里是文档的链接:

Data-Binding Expressions Overview

这是我的代码:

protected void Page_Load(object sender, EventArgs e)
    {
        DataTable table = new DataTable();
        table.Columns.Add("Data");
        for(int i = 0; i < 20; i++)
            table.Rows.Add(new object[] { i });
        GridView1.DataSource = table;
    if(!IsPostBack)  // <<<<<<<<<<<<
        GridView1.DataBind();
    }
protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
    {
        GridView1.EditIndex = e.NewEditIndex;
        GridView1.DataBind();
    }       

    protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        TextBox text = (TextBox)GridView1.Rows[e.RowIndex].FindControl("txtId");
    }

【讨论】:

  • 不。我试过这个。它没有帮助。我仍然得到渲染的值而不是修改的值
  • .Net 4. :).....我已经尝试了很多,现在我被困了大约 12 小时。我想知道有什么问题。只是太想知道我到底做错了什么
  • 我认为是因为您在每个 Page_Load 调用 Bind。这应该只做一次。检查我发布的代码,它在这里工作正常。此外,应该使用 Bind 表达式。
  • 即使我遇到同样的问题.. 编辑:你们中的任何人都发现了问题吗?
【解决方案2】:

如果您已编写代码以在页面加载中绑定网格,请确保将其包含在 if(!IsPostBack) 中 希望对你有帮助

【讨论】:

    【解决方案3】:

    试试这个

    TextBox text = (TextBox)GridView1.Rows[e.EditIndex].FindControl("txtName");

    【讨论】:

    • 在 rowupdating 事件期间给出旧值,而不是更新值
    【解决方案4】:

    这最终对我有用。

    protected void MyGridView_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        string value = e.NewValues[0].ToString();
        // ...
    }
    

    【讨论】:

    • 在 rowupdating 事件期间给出旧值,而不是更新值
    【解决方案5】:

    我正在关注 platon,它成功了!

    if(!IsPostBack) 放在databind() 之前, 并在GridView1.EditIndex = e.NewEditIndex; 之后插入GridView1.DataBind(); GridView1_RowEditing

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多