gridview findcontrol返回空字符串(空白)

时间:2017-09-07 17:04:52

标签: c# asp.net gridview postback findcontrol

我正在尝试使用GridView1_RowEditing1事件从gridview选择行传递会话值。我能够获得primarykey(p.key)的会话值,但Associate_ID返回空。

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>

输出:

关键:5

名称:

正如您所看到的,我没有获得所选字段的Associate_ID。 也尝试使用

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

但没有结果,网格有多个列和行(8 * 15)

gridview findcontrol returning empty ""上尝试了建议,并尝试停止在PostBack上重新绑定GridView。 从gridview

中删除了DataSourceID
<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();
        }
    }

这些都没有帮助。我仍然为Associate_ID获取一个空值。 我无法看到问题所在。请帮忙!

2 个答案:

答案 0 :(得分:0)

您正在尝试使用FindControl查找Control Associate_ID。但它不存在。找到TextBox1或将TextBox重命名为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"));

更新

我看到了这个问题,不知怎的,你试图通过重新绑定GridView来激活编辑状态之前访问这些控件。编辑索引尚未设置。所以把它放在FindControl之前。

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

答案 1 :(得分:0)

非常感谢VDWWD,我终于能够让它发挥作用了。 问题是我无法使用get my&#39; TextBox&#39; gridView中的元素使用FindControl。 解决方案是不在页面的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>