我正在尝试以编程方式在ASP.NET
中添加一个按钮,C#
作为后端。我能够显示按钮,但当用户单击按钮时,RowCommand不会被触发。
我认为问题是我在用户点击“提交”按钮后创建按钮。如果我在page_load中创建按钮,则RowCommand可以正常工作。
这就是网站的流程:
GridView
,其中包含ButtonField
。 GridView
和ButtonField
都是在后端动态创建的。RowCommand
以下是代码:
Page_load
protected void Page_Load(object sender, EventArgs e)
{
//Nothing because we only want to create the button after the user
//clicks on submit
}
randomGridView
生成Gridviews和按钮
public void randomGridView(Table t, int x)
{
GridView gv1 = new GridView();
GridView gv2 = new GridView();
GridView gv3 = new GridView();
GridView gv4 = new GridView();
TableRow r = new TableRow();
for (int i = 0; i < x; i++)
{
TableCell c = new TableCell();
c.BorderStyle = BorderStyle.Solid;
if (i == 0)
{
c.Controls.Add(gv1);
}
if (i == 1)
{
c.Controls.Add(gv2);
}
if (i == 2)
{
c.Controls.Add(gv3);
}
if (i == 3)
{
c.Controls.Add(gv4);
}
r.Cells.Add(c);
}
t.Rows.Add(r);
//Where the xml gets bonded to the data grid
XmlDataSource xds = new XmlDataSource();
xds.Data = xml;
xds.DataBind();
xds.EnableCaching = false;
gv1.DataSource = xds;
ButtonField temp = new ButtonField();
temp.ButtonType = ButtonType.Image;
temp.ImageUrl = "~/checkdailyinventory.bmp";
temp.CommandName = "buttonClicked";
temp.HeaderText = " ";
gv1.Columns.Add(temp);
gv1.RowCommand += new GridViewCommandEventHandler(CustomersGridView_RowCommand);
gv1.RowDataBound += new GridViewRowEventHandler(inventoryGridView_RowDataBound);
gv1.DataBind();
xds.Data = xml;
xds.DataBind();
xds.EnableCaching = false;
gv2.DataSource = xds;
gv2.DataBind();
xds.Data = xml;
xds.DataBind();
xds.EnableCaching = false;
gv3.DataSource = xds;
gv3.DataBind();
xds.Data = xml;
xds.DataBind();
xds.EnableCaching = false;
gv4.DataSource = xds;
gv4.DataBind();
}
inventoryGridView_RowDataBound
我尝试手动添加按钮到第一个单元格
public void inventoryGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
Button temp = new Button();
temp.CommandName = "buttonClicked";
temp.Text = "temp button!";
e.Row.Cells[0].Controls.Add(temp);
}
CustomersGridView_RowCommand
这是需要解雇的问题
public void CustomersGridView_RowCommand(Object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "buttonClicked")
{
int index = Convert.ToInt32(e.CommandArgument);
Label1.Text = index.ToString();
}
}
Button1_Click
实际创建网格视图和按钮的内容
public void Button1_Click(object sender, EventArgs e)
{
randomGridView(Table1, 1);
randomGridView(Table2, 4);
}
那么如何让按钮触发CustomersGridView_RowCommand
?或者是否无法链接动态生成的按钮?
<table>
<tr>
<td>
<div id="div1" style="width: 257px; height: 500px; overflow-x: scroll; overflow-y: hidden;">
<asp:Table ID="Table1" runat="server">
</asp:Table>
</div>
</td>
<td>
<div id="div2" style="width: 500px; height: 500px; overflow: scroll;">
<asp:Table ID="Table2" runat="server">
</asp:Table>
</div>
</td>
</tr>
</table>
答案 0 :(得分:3)
这不是不可能的。您需要了解当从视图状态重新加载页面时,控件树(您使用randomGridView方法补充)会自动重建,但这些动态添加的控件的事件处理程序不会自动重建。
特别是,这一行附加了事件处理程序:
gv1.RowCommand += new GridViewCommandEventHandler(CustomersGridView_RowCommand);
当您从视图状态页面重新加载时,不会重新执行,当您单击网格中的一个按钮并且浏览器将页面发布回服务器时,它必须执行此操作。
您的解决方案是在Load事件阶段检查页面是否有回发条件。如果Page.IsPostBack为true,则扫描控制树以获取这些动态生成的网格,并为RowCommand事件设置事件处理程序(如上面的代码)。
答案 1 :(得分:1)
我最终能够在动态创建后启动RowCommand。这是我的解决方案,虽然我不能说这是最好的做事方式:
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
if (IsPostBack){
if (Request.Form[Button1.UniqueID] != null)
{
//Get the data from the server
randomGridView(Table1, 1);
randomGridView(Table2, 4);
}
//Just display the form here
}
}
现在我没有等到按钮点击事件,而是等到按钮被点击后,我会检查OnInit。如果那时我知道用户想要我加载数据并显示它。目前在上面的代码中,我只是在同一个函数中制作和显示数据(这是一个糟糕的设计,但我只是简单的原型设计)。
然后,只要用户点击任何会导致回发的内容,它就会将表格添加到控件中。然后控件可以触发(我不知道为什么或如何,但它的工作原理..)
只是为了表明我们甚至不需要按钮功能:
public void Button1_Click(object sender, EventArgs e)
{
//randomGridView(Table1, 1);
//randomGridView(Table2, 4);
//Session.Add("doIt",true);
}
同样,这可能不是最好的做事方式,但它确实有效。如果有人有更好的解决方案,请告诉我。