【问题标题】:gridview findcontrol returning nothing empty string(Blank)gridview findcontrol 返回空字符串(空白)
【发布时间】:2018-02-16 12:17:35
【问题描述】:

我正在尝试使用 GridView1_RowEditing1 事件从 gridview 选择行传递会话值。我能够获取主键(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 的空白值。 我看不出问题出在哪里。请帮忙!

【问题讨论】:

    标签: c# asp.net gridview postback findcontrol


    【解决方案1】:

    您正在尝试使用 FindControl 查找控件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();
    

    【讨论】:

    • 我尝试按照您提到的那样更改文本框 ID,但它没有给出空白“”
    • 通过下面的使用确认它确实返回了 NULL。 TextBox name= (TextBox)GridView1.Rows[3].Cells[3].FindControl("TextBox1"); string Ques = name.Text;) - 这引发了 NullReferenceException 错误
    • First Comment 编辑:我尝试按照你提到的那样更改文本框 ID,但它仍然给出一个空白“”
    • 更新了我的回答。您永远不会设置编辑索引。
    【解决方案2】:

    非常感谢 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>
    

    【讨论】:

      猜你喜欢
      • 2011-10-28
      • 2012-01-25
      • 1970-01-01
      • 1970-01-01
      • 2016-04-01
      • 1970-01-01
      • 2013-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多