【问题标题】:Updating GridView Row from Code Behind从后面的代码更新 GridView 行
【发布时间】:2012-07-27 19:41:27
【问题描述】:

当用户在编辑模板中更改文本框中的文本并单击更新时,当我尝试获取这些新值时,它仍然是文本框的旧值。

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
        DataKeyNames="CompanyID" CellPadding="4"  
        GridLines="None" Width="1079px" ForeColor="#333333" 
        OnRowCancelingEdit="GridView1_RowCancelling"
        OnRowUpdating="GridView1_RowUpdating"
        OnRowEditing="GridView1_RowEditing">


        <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
        <Columns>
            <asp:TemplateField ShowHeader="False">

                <EditItemTemplate>
                    <asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="True" 
                        CommandName="Update" CommandArgument='<%# Eval("CompanyID") %>' Text="Update"></asp:LinkButton>
                    &nbsp;<asp:LinkButton ID="LinkButton2" runat="server" CausesValidation="False" 
                        CommandName="Cancel" Text="Cancel"></asp:LinkButton>
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="False" 
                        CommandName="Edit" Text="Edit" ></asp:LinkButton>
                </ItemTemplate>


            </asp:TemplateField>



            <asp:TemplateField HeaderText="Issue Date">

                <ItemTemplate>
                    <asp:Label runat="server" ID="IssueDate" Text='<%#Eval("IssueDate") %>' />                    
                </ItemTemplate>

                <EditItemTemplate>
                    <asp:TextBox runat="server" ID="txtIssueDate" Text='<%#Eval("IssueDate") %>' />
                </EditItemTemplate>

            </asp:TemplateField>


            <asp:TemplateField HeaderText="Notice Intent Response Due">

                <ItemTemplate>
                    <asp:Label runat="server" ID="NoticeIntentResponseDue" Text='<%#Eval("NoticeIntentResponseDue") %>' />                    
                </ItemTemplate>

                <EditItemTemplate>
                    <asp:TextBox runat="server" ID="txtNoticeIntentResponseDue" Text='<%#Eval("NoticeIntentResponseDue") %>' />
                </EditItemTemplate>

            </asp:TemplateField>


            <asp:TemplateField HeaderText="Deadline For Questions">

                <ItemTemplate>
                    <asp:Label runat="server" ID="DeadlineForQuestions" Text='<%#Eval("DeadlineForQuestions") %>' />                    
                </ItemTemplate>

                <EditItemTemplate>
                    <asp:TextBox runat="server" ID="txtDeadlineForQuestions" Text='<%#Eval("DeadlineForQuestions") %>' />
                </EditItemTemplate>

            </asp:TemplateField>


            <asp:TemplateField HeaderText="Bids Due">

                <ItemTemplate>
                    <asp:Label runat="server" ID="BidsDue" Text='<%#Eval("BidsDue") %>' />                    
                </ItemTemplate>

                <EditItemTemplate>
                    <asp:TextBox runat="server" ID="txtBidsDue" Text='<%#Eval("BidsDue") %>' />
                </EditItemTemplate>

            </asp:TemplateField>


            <asp:TemplateField HeaderText="Shortlist Notice">

                <ItemTemplate>
                    <asp:Label runat="server" ID="ShortlistNotice" Text='<%#Eval("ShortlistNotice") %>' />                    
                </ItemTemplate>

                <EditItemTemplate>
                    <asp:TextBox runat="server" ID="txtShortlistNotice" Text='<%#Eval("ShortlistNotice") %>' />
                </EditItemTemplate>

            </asp:TemplateField>


            <asp:TemplateField HeaderText="Final Selection">

                <ItemTemplate>
                    <asp:Label runat="server" ID="FinalSelection" Text='<%#Eval("FinalSelection") %>' />                    
                </ItemTemplate>

                <EditItemTemplate>
                    <asp:TextBox runat="server" ID="txtFinalSelection" Text='<%#Eval("FinalSelection") %>' />
                </EditItemTemplate>

            </asp:TemplateField>





            <asp:TemplateField Visible="false" HeaderText="CompanyID">

                <ItemTemplate>
                    <asp:Label runat="server" ID="CompanyID" Text='<%#Eval("CompanyID") %>' />
                </ItemTemplate>

            </asp:TemplateField>




        </Columns>



    </asp:GridView>

更新按钮调用这个函数:

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)

    {

        int key = Convert.ToInt32(GridView1.DataKeys[e.RowIndex].Value);

        Label CompanyID = (Label)GridView1.Rows[e.RowIndex].FindControl("txtCompanyID");

        TextBox thisIssueDate = (TextBox)(GridView1.Rows[e.RowIndex].FindControl("txtIssueDate"));

        TextBox NoticeIntentResponseDue = (TextBox)GridView1.Rows[e.RowIndex].FindControl("txtNoticeIntentResponseDue");

        Response.Write(NoticeIntentResponseDue.Text + " " + thisIssueDate.Text);
        Response.End();

        TextBox DeadlineForQuestions = (TextBox)GridView1.Rows[e.RowIndex].FindControl("txtDeadlineForQuestions");

        TextBox BidsDue = (TextBox)GridView1.Rows[e.RowIndex].FindControl("txtBidsDue");

        TextBox ShortlistNotice = (TextBox)GridView1.Rows[e.RowIndex].FindControl("txtShortlistNotice");

        TextBox FinalSelection = (TextBox)GridView1.Rows[e.RowIndex].FindControl("txtFinalSelection");
    }  

响应显示,被抓取的值仍然是框的原始文本值。不是您在框中输入的内容。

【问题讨论】:

  • 你在哪里绑定GridView?您可能需要确保在 if(!IsPostBack) { } 内执行此操作,因为编辑命令可能会触发 PostBack,从而将网格重新绑定到其原始值。
  • 问题看起来像你已经将你的编辑项模板列与数据表中的数据绑定了,当你在后面的代码中获取数据时,你没有得到用户的更新数据在编辑模式下更新,你仍然得到旧数据。
  • 在不绑定编辑项模板字段的情况下运行您的代码并检查您的代码是否可以工作。
  • 即使我没有绑定到编辑模板,仍然做同样的事情

标签: c# asp.net datagrid code-behind


【解决方案1】:

在您的网格视图行更新事件中添加以下条件

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
 if (e.Row.RowState == DataControlRowState.Edit )
 {


    int key = Convert.ToInt32(GridView1.DataKeys[e.RowIndex].Value);

    Label CompanyID = (Label)GridView1.Rows[e.RowIndex].FindControl("txtCompanyID");

    TextBox thisIssueDate = (TextBox)(GridView1.Rows[e.RowIndex].FindControl("txtIssueDate"));

    TextBox NoticeIntentResponseDue = (TextBox)GridView1.Rows[e.RowIndex].FindControl("txtNoticeIntentResponseDue");

    Response.Write(NoticeIntentResponseDue.Text + " " + thisIssueDate.Text);
    Response.End();

    TextBox DeadlineForQuestions = (TextBox)GridView1.Rows[e.RowIndex].FindControl("txtDeadlineForQuestions");

    TextBox BidsDue = (TextBox)GridView1.Rows[e.RowIndex].FindControl("txtBidsDue");

    TextBox ShortlistNotice = (TextBox)GridView1.Rows[e.RowIndex].FindControl("txtShortlistNotice");

    TextBox FinalSelection = (TextBox)GridView1.Rows[e.RowIndex].FindControl("txtFinalSelection");
    }  
  }

更新: 问题看起来像您还绑定了您的编辑项模板列与数据表中的数据,并且当您在后面的代码中获取数据时,您没有获得用户在编辑模式下更新的更新数据并且您仍然得到旧数据。 If you remove the Binding from the Edit Item Template feilds then your code will work.

【讨论】:

  • 即使我没有绑定到编辑模板,仍然做同样的事情
  • 您是否添加此代码if (e.Row.RowState == DataControlRowState.Edit )
  • 我知道为什么,但它不允许我打电话给 e.Row。我正在使用以下系统-使用系统;使用 System.Collections.Generic;使用 System.Linq;使用 System.Web;使用 System.Web.UI;使用 System.Web.UI.WebControls;使用 System.Data.SqlClient;使用 System.Data;使用 System.Data.Common;使用 System.Text.RegularExpressions;
  • 试试这个把这个事件添加到你的页面protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e) { //Set the edit index. TaskGridView.EditIndex = e.NewEditIndex; BindData(); // bind your grid view }
  • 试试这个来获取文本框的引用`TextBox t = (TextBox)(row.Cells[1].Controls[0]);或 TextBox t = (TextBox)(row.Cells[1].Controls[1]);` 对于所有控件
【解决方案2】:

我想通了,Derek 是对的。它与页面加载中回发的绑定数据有关。我每次都绑定数据,而不仅仅是第一次。谢谢

【讨论】:

    猜你喜欢
    • 2011-09-14
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多