我试图以编程的方式在ASP.NET中添加一个按钮,并以C#作为后端。我能够显示按钮,但是当用户单击按钮时,RowCommand不会被触发。
我相信问题是,在用户单击"Submit“按钮后,我正在创建按钮。如果我在page_load中设置了按钮,那么RowCommand就能工作。
这就是该网站的运作方式:
ButtonField的GridView。在backend.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
生成Gridview和按钮。
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呢?还是不可能将动态生成的按钮链接起来?
编辑:这是ASPX页面:
<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>发布于 2012-06-22 18:22:51
在动态创建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
}
}现在,如果单击了按钮,而不是等待到button_click事件,而是签入OnInit。如果是这样的话,我知道用户希望我加载数据并显示出来。目前,在上面的代码中,我只是在同一个函数中生成和显示数据(这是一个糟糕的设计,但我只是简单地进行了原型设计)。
然后,每当用户单击会导致回发的任何内容时,它都会将表添加到控件中。然后这些控件就可以启动了(我不知道为什么或如何,但它是工作的)
为了表明我们甚至不需要按钮功能:
public void Button1_Click(object sender, EventArgs e)
{
//randomGridView(Table1, 1);
//randomGridView(Table2, 4);
//Session.Add("doIt",true);
}同样,这可能不是最好的方法,但它是有效的。如果有人有更好的解决办法,请告诉我。
发布于 2012-06-21 18:42:54
不是不可能的。您需要理解的是,当页面从视图状态重新加载时,控件树(您用randomGridView方法进行补充)将自动重新构建,但是这些动态添加的控件的事件处理程序不会自动重建。
特别是,附加事件处理程序的这一行:
gv1.RowCommand += new GridViewCommandEventHandler(CustomersGridView_RowCommand); 当页面从视图状态重新加载时,不会得到重新执行,当您单击网格中的一个按钮,浏览器将页面发回服务器时,它必须重新执行。
您的解决方案将是在Load事件阶段检查页面是否有回发条件。如果Page.IsPostBack为真,则扫描控制树以查找这些动态生成的网格,并为RowCommand事件设置事件处理程序(如上面的代码)。
https://stackoverflow.com/questions/11144580
复制相似问题