Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 向GridView动态添加命令按钮_C#_Asp.net - Fatal编程技术网

C# 向GridView动态添加命令按钮

C# 向GridView动态添加命令按钮,c#,asp.net,C#,Asp.net,我在尝试向网格中添加按钮时遇到问题。我的GridView首先在PageLoad事件中加载数据 然后,我将获取每行第一个单元格中的数据,并创建一个链接到URL的按钮。要获取URL,我必须使用第一个单元格中的数据作为参数运行查询。起初我是在RowDataBound事件中这样做的,但对每一行执行该查询会使其速度非常慢 所以我决定添加一个按钮,它只在您单击按钮时检索URL 以下是我的GridView: <asp:GridView ID="gvResults" runat="server"

我在尝试向网格中添加按钮时遇到问题。我的GridView首先在PageLoad事件中加载数据

然后,我将获取每行第一个单元格中的数据,并创建一个链接到URL的按钮。要获取URL,我必须使用第一个单元格中的数据作为参数运行查询。起初我是在RowDataBound事件中这样做的,但对每一行执行该查询会使其速度非常慢

所以我决定添加一个按钮,它只在您单击按钮时检索URL

以下是我的GridView:

<asp:GridView ID="gvResults" runat="server"
    OnRowDataBound="gvResults_RowDataBound"
    OnRowCommand="gvResults_RowCommand">               
</asp:GridView>    
网格生成很好,每行的按钮都会添加到网格中。但当我单击它时,RowCommand事件不会触发,页面只会刷新


有人知道问题出在哪里吗?

为什么要使用动态按钮?您可以轻松地将linkbutton直接放入gridview的标记中(只要您不介意使用模板字段),并且无需处理RowDataBound事件

您的标记将如下所示:

<Columns>
    <asp:TemplateField HeaderText="SomeHeaderText">
            <ItemTemplate>
                <asp:LinkButton ID="lnkBtn" runat="server" CommandName="NumClick" CommandArgument= '<%# (string)Eval("dbValue") %>'  Text='<%# (string)Eval("dbValue") %>'></asp:LinkButton>
            </ItemTemplate>
        </asp:TemplateField>        
    <asp:BoundField></asp:BoundField>
    <asp:BoundField></asp:BoundField>
    <asp:BoundField></asp:BoundField>
</Columns>


向RowCommand事件添加断点,并确保可以命中断点

问题可能在别处


另外,请确保您没有在回发时进行数据绑定。

您的代码有很大的问题。我很难解释你的大错误是什么,但我可以很容易地告诉你如何纠正

问题是您在
RowDataBound
事件中生成了一个新按钮,这肯定是最错误的选择。之所以呈现该按钮,是因为当页面呈现时,该按钮在该事件之后存在,但在数据绑定之前不存在。如果每次加载页面时(即使在回发期间)都绑定数据,则按钮仍会呈现,因为您生成了一个新按钮

但由于按钮在数据绑定之前不存在,因此无法引发事件。必须将标记中的按钮声明为GridView模板,然后不是使用new
LinkButton()
而是使用
e.Row.Cells[0].FindControl(“buttonId”)
访问该按钮,并设置其文本。然后,您必须设置它的标记,以便触发它自己的
命令
事件(而不是
行命令
),并按您使用的方式处理它(在数据绑定期间不要忘记设置
命令参数


[编辑]我还犯了一个错误:数据绑定控件中的控件在数据绑定之前也不存在。但是它们不是用
new Control()
(通过数据绑定控件的私有方法)初始化的,而是用
Page.LoadControl(typeof(Control))
初始化的。这是动态加载控件时必须解决的第一件事

由于控件是在databind上动态添加的,并且每次回发都必须对gridview进行数据绑定,因此每次“单击”的控件都是不同的。事件不会激发,因为在需要激发时,它并不存在,因为它在页面的最后一次迭代中就存在

我注意到您没有任何逻辑来确定按钮是否应该在那里,它总是进入单元格[0]


您应该将此按钮放置到TemplateItem中,以使其正确存在。如果您需要在代码隐藏中执行此操作,则最好在RowCreated事件中执行此操作。

在将链接按钮添加到单元格之前,我会将其与ID关联。这就是问题所在,我确实在RowCommand事件中添加了一个断点,但事件从未触发。而且我不会在回邮上绑定数据。太棒了。尽可能多地尝试和使用标记始终是一种好的做法。如果可以将某些内容从代码中移到标记中,那么就去做。如果我有一个动态填充的网格视图。。然后我不能在标记中声明字段,因为列的数量每次都可能改变。那么我们应该怎么做呢..我也有几乎相同的问题。我有一个动态网格,其中我附加了两个事件。Rowcommand和rowdatabound。在rowdatabound事件中,我添加了一些编辑和删除按钮。我可以在其他地方的每一行添加编辑和删除按钮吗
<Columns>
    <asp:TemplateField HeaderText="SomeHeaderText">
            <ItemTemplate>
                <asp:LinkButton ID="lnkBtn" runat="server" CommandName="NumClick" CommandArgument= '<%# (string)Eval("dbValue") %>'  Text='<%# (string)Eval("dbValue") %>'></asp:LinkButton>
            </ItemTemplate>
        </asp:TemplateField>        
    <asp:BoundField></asp:BoundField>
    <asp:BoundField></asp:BoundField>
    <asp:BoundField></asp:BoundField>
</Columns>