rowdatabound上的GridView Button引用

时间:2014-10-23 15:08:59

标签: c# asp.net gridview findcontrol

我觉得我在这里遗漏了一些明显的东西,但我还没有得到它。我有一个带有模板字段列的gridview,其中有一个按钮和一个隐藏字段。我试图获取行数据绑定上的按钮和隐藏字段的引用,因为按钮的标签和命令参数等都会根据其他行数据而变化。

如果我在下面的代码中指示的区域放置一个断点,我可以看到隐藏的字段被正确分配,但按钮不是。我在这里缺少什么?

GridView.aspx

<asp:GridView ID="gvCurrentQueueStatus" runat="server" AutoGenerateColumns="False"
    OnRowDataBound="gvCurrentQueueStatus_RowDataBound">
    <Columns>
        <asp:TemplateField ItemStyle-HorizontalAlign="Center" HeaderText="Service Controls">
                <ItemTemplate>
                    <asp:Button ID="btnSubmitCommand" runat="server" Text="Control" OnClick="btnSubmitCommand_Click" />
                    <asp:HiddenField ID="hdnQueueNumber" runat="server" Value='<%# Eval("ReportQueueNumber") %>' />
                </ItemTemplate>
        </asp:TemplateField>
    </Columns>

</asp:GridView>

GridView.aspx.cs

protected void gvCurrentQueueStatus_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {

        Button controlButton = (Button)e.Row.FindControl("btnSubmitCommand"); // FindControl fails
        HiddenField hdnQueueNumber = (HiddenField)e.Row.FindControl("hdnQueueNumber"); // FindControl succeeds

        // Other stuff
    } // breakpoint here, successfully finds htnQueueNumber, but not btnSubmitCommand
}

2 个答案:

答案 0 :(得分:1)

试试这个:

Button controlButton = e.Row.FindControl("btnSubmitCommand") as Button ;

或者尝试这种方式:

     foreach (GridViewRow row in gvCurrentQueueStatus.Rows) {
   Button controlButton = (Button)gvCurrentQueueStatus.Rows[row.RowIndex].FindControl("btnSubmitCommand");
  }

答案 1 :(得分:0)

所以显然我的按钮实际上被正确分配了,当我在调试器中调用变量时,它只是没有报告。

我实际上并不疯狂,但Visual Studio的调试器却需要旧的“你试过把它关掉再打开”。

对那些帮助调查我的问题的人表示抱歉:3