2017-09-07 92 views
0

我想通过GridView1_RowEditing1事件从gridview选择行传递一个会话值。我能够获得primarykey(p.key)的会话值,但Associate_ID返回空值。gridview findcontrol什么都不返回空字符串(空白)

C#代码背后

protected void GridView1_RowEditing1(object sender, GridViewEditEventArgs e) 
    { 
     int primarykey = Convert.ToInt32(GridView1.DataKeys[e.NewEditIndex].Value); 
     string name = Convert.ToString(GridView1.Rows[e.NewEditIndex].FindControl("Associate_ID")); 
     Session["Number"] = primarykey; 
     Session["Name"] = name; 
     //redirect 
     Response.Redirect("updatee.aspx"); 
    } 

.ASPX

<asp:TemplateField HeaderText="Associate_ID" SortExpression="Associate_ID"> 
       <EditItemTemplate> 
        <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("Associate_ID") %>'></asp:TextBox> 
       </EditItemTemplate> 
       <ItemTemplate> 
        <asp:Label ID="Label1" runat="server" Text='<%# Bind("Associate_ID") %>'></asp:Label> 
       </ItemTemplate> 
      </asp:TemplateField> 

OUTPUT:

关键:5

名称:

正如你可以看到我没有得到所选字段的Associate_ID。 使用

string name = Convert.ToString(GridView1.Rows[3].Cells[3].FindControl("Associate_ID")); 

也试过,但没有结果,网格具有多行多列(8 * 15)

试过gridview findcontrol returning empty ""建议,并试图阻止再结合上回发的GridView控件。从GridView控件

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="ID" OnRowEditing="GridView1_RowEditing1" OnSelectedIndexChanged="GridView1_SelectedIndexChanged"> 

背后

 protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      //DataSourceID = "SqlDataSource1" 
      GridView1.DataSource = SqlDataSource1; 
      GridView1.DataBind(); 
     } 
    } 

没有这个代码 删除DataSourceID的帮助。我仍然为Associate_ID获得空白值。 我无法看到问题出在哪里。请帮忙!

回答

0

您正试图在FindControl中找到Control Associate_ID。但它不存在。找到TextBox1或将文本框重命名为Associate_ID

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

//or 

string name = Convert.ToString(GridView1.Rows[3].Cells[3].FindControl("TextBox1")); 

UPDATE

我看到了问题,不知为何,你试图编辑状态已经被重新绑定在GridView启动之前访问这些控制。编辑索引尚未设置。所以把它放在FindControl之前。

GridView1.DataSource = yourSource; 
GridView1.EditIndex = e.NewEditIndex; 
GridView1.DataBind(); 
+0

你所说的我试图改变文本框的ID,但它不是给人一种空白“” – rakesh

+0

也尝试重命名文本框,仍然一样:( – rakesh

+0

确认它确实使用下面的方式返回NULL。的FindControl(“TextBox1的”);'' 串疑问句= name.Text;)' - 这扔一个NullReferenceException错误 – rakesh

0

非常感谢你,VDWWD,我终于能够得到它的工作。 问题是我无法使用FindControl在gridview中使用我的'TextBox'元素。 解决方法是不重新绑定页面的PostBack上的GridView并在RowEditing事件上编辑索引。

这是我工作的代码看起来像,是任何人曾经遇到类似的问题

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      GridView1.DataSource = SqlDataSource1; 
      GridView1.DataBind(); 
     } 
    } 
    protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e) 
    { 
     GridView1.DataSource = SqlDataSource1; 
     GridView1.EditIndex = e.NewEditIndex; 
     GridView1.DataBind(); 
     TextBox txt = GridView1.Rows[e.NewEditIndex].FindControl("TextBox1") as TextBox; 
     string name = txt.Text; 
    } 

.ASPX

 <EditItemTemplate> 
        <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("CountryName") %>'></asp:TextBox> 
       </EditItemTemplate>