0

我有网格视图,我想在其中更新行,但它没有发生。数据源是一个 DataTable。请帮忙。


下面是标记

<asp:GridView ID="GrdV" runat="server" AutoGenerateColumns="false"   
   OnRowEditing="GrdV_RowEditing"  OnRowUpdating="GrdV_RowUpdating">

 <Columns>
   <asp:TemplateField HeaderText="Clip Description">
        <ItemTemplate>
            <asp:Label ID="lblDescrptn" runat="server" Text='<%# Bind("Description") %>'>
            </asp:Label>
        </ItemTemplate>
        <EditItemTemplate>
            <asp:TextBox ID="descTbx" runat="server" Text='<%# Bind("Description") %>'>
            </asp:TextBox>
        </EditItemTemplate>
    </asp:TemplateField>

   <asp:CommandField ShowEditButton="True" />

 </Columns>

这是后面的代码

    protected void GrdV_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {

        // Retrieve the row being edited.
      int index = GrdV.EditIndex;
        GridViewRow row = GrdV.Rows[index];           
        TextBox t1 = row.FindControl("descTbx") as TextBox;

        DataTable dt = (DataTable)Session["tmdataTable"];

        dt.Rows[index]["Description"] = t1.Text; //Description is a column of my DataTable
        dt.AcceptChanges();
        GrdV.EditIndex = -1;
        GrdV.DataSource = dt;
        GrdV.DataBind();

    }

在调试时,我发现文本框正在传递空字符串t1.Text ="",即使我已经用新值填充了文本框。我认为错误是一致的

TextBox t1 = row.FindControl("descTbx") as TextBox;

页面加载代码

    protected void Page_Load(object sender, EventArgs e)
    {

        if (!IsPostBack)
        {
            GrdV.DataSource = Session["tmdataTable"];
            GrdV.DataBind();
        }


        DataTable Finaldt = getTable();

        GrdV.DataSource = Finaldt;
        GrdV.DataBind();
        Session["tmdataTable"] = Finaldt;

    }
4

3 回答 3

1

EditIndex不可用,您需要来自GridViewUpdateEventArgs

// Retrieve the row being edited.
DataTable dt = (DataTable)Session["tmdataTable"];
GridViewRow row = GrdV.Rows[e.RowIndex];
TextBox t1 = row.FindControl("descTbx") as TextBox;

dt.Rows[row.DataItemIndex]["Description"] = t1.Text; //Description is a column of my DataTable
dt.AcceptChanges();
GrdV.EditIndex = -1;
GrdV.DataSource = dt;
GrdV.DataBind();
于 2013-04-06T07:30:06.310 回答
0
 protected void GrdV_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
         if (e.Item is GridDataItem)
        {
        // Retrieve the row being edited.
      int index = GrdV.EditIndex;
        GridViewRow row = GrdV.Rows[index];           
        TextBox t1 = row.FindControl("descTbx") as TextBox;

        DataTable dt = (DataTable)Session["tmdataTable"];

        dt.Rows[index]["Description"] = t1.Text; //Description is a column of my DataTable
        dt.AcceptChanges();
        GrdV.EditIndex = -1;
        GrdV.DataSource = dt;
        GrdV.DataBind();
        }
    }
于 2013-04-06T07:17:59.110 回答
0

稍微更改您的代码并检查。更改EditIndexe.RowIndex

protected void GrdV_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    GridViewRow row = GrdV.Rows[e.RowIndex]; // this line is changed      
    TextBox t1 = row.FindControl("descTbx") as TextBox;

    DataTable dt = (DataTable)Session["tmdataTable"];

    dt.Rows[row.DataItemIndex]["Description"] = t1.Text; //Description is a column of my DataTable
    dt.AcceptChanges();
    GrdV.EditIndex = -1;
    GrdV.DataSource = dt;
    GrdV.DataBind();
}

你有没有这样做:

protected void Page_Load(object sender, EventArgs e)
{     
    if(!IsPostBack)
    {
        GrdV.DataSource = Session["tmdataTable"];
        GrdV.DataBind();
    }
}
于 2013-04-06T07:28:00.640 回答