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