C# 命令不开火
我试图以编程方式在C# 命令不开火,c#,asp.net,gridview,C#,Asp.net,Gridview,我试图以编程方式在ASP.NET中添加一个按钮,并将C#作为后端。我可以显示该按钮,但当用户单击该按钮时,不会触发row命令 我认为问题在于,我是在用户单击“提交”按钮后创建按钮的。如果我使页面中的按钮加载,那么row命令可以工作 以下是网站的流程: 页面加载:显示基本数据 用户单击一个提交按钮,该按钮创建一个网格视图,其中有一个按钮字段。GridView和ButtonField都是在后端动态创建的 然后,用户单击生成的按钮,它将触发row命令 代码如下: 页面加载 randomGridView
ASP.NET
中添加一个按钮,并将C#
作为后端。我可以显示该按钮,但当用户单击该按钮时,不会触发row命令
我认为问题在于,我是在用户单击“提交”按钮后创建按钮的。如果我使页面中的按钮加载,那么row命令可以工作
以下是网站的流程:
网格视图
,其中有一个按钮字段
。GridView
和ButtonField
都是在后端动态创建的row命令
页面加载
randomGridView
生成网格视图和按钮
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();
}
CustomersGridView\u row命令
这就是需要被解雇的原因
public void CustomersGridView_RowCommand(Object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "buttonClicked")
{
int index = Convert.ToInt32(e.CommandArgument);
Label1.Text = index.ToString();
}
}
按钮1\u单击
究竟是什么创建了GridView和按钮
public void Button1_Click(object sender, EventArgs e)
{
randomGridView(Table1, 1);
randomGridView(Table2, 4);
}
那么,如何让按钮触发CustomerGridView\u RowCommand
?还是不可能链接动态生成的按钮
编辑:以下是ASPX页面:
这不是不可能的。您需要了解,当从视图状态重新加载页面时,控件树(您用randomGridView方法补充)会自动重建,但这些动态添加的控件的事件处理程序不会自动重建 特别是,这一行附加了事件处理程序:
gv1.RowCommand += new GridViewCommandEventHandler(CustomersGridView_RowCommand);
当您从视图状态重新加载页面时,不会重新执行,当您单击网格中的一个按钮,浏览器将页面发回服务器时,必须执行此操作
您的解决方案是在加载事件阶段检查页面是否存在回发条件。如果Page.IsPostBack为true,请扫描控件树以查找这些动态生成的网格,并为RowCommand事件设置事件处理程序(如上面的代码)。这并非不可能。您需要了解,当从视图状态重新加载页面时,控件树(您用randomGridView方法补充)会自动重建,但这些动态添加的控件的事件处理程序不会自动重建 特别是,这一行附加了事件处理程序:
gv1.RowCommand += new GridViewCommandEventHandler(CustomersGridView_RowCommand);
当您从视图状态重新加载页面时,不会重新执行,当您单击网格中的一个按钮,浏览器将页面发回服务器时,必须执行此操作
您的解决方案是在加载事件阶段检查页面是否存在回发条件。如果Page.IsPostBack为true,请扫描控件树以查找这些动态生成的网格,并为RowCommand事件设置事件处理程序(如上面的代码)。我最终能够在动态创建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
}
}
现在,我不再等待按钮点击事件,而是检查按钮是否被点击。如果是,那么我知道用户希望我加载数据并显示它。目前在上面的代码中,我只是在同一个函数中生成和显示数据(这是一个糟糕的设计,但我只是简单地进行了原型设计)
然后,每当用户单击任何会导致回发的内容时,它都会将表添加到控件中。然后控制装置就可以启动了(我不知道为什么或者如何启动,但它可以工作……)
只是为了表明我们甚至不需要按钮功能:
public void Button1_Click(object sender, EventArgs e)
{
//randomGridView(Table1, 1);
//randomGridView(Table2, 4);
//Session.Add("doIt",true);
}
同样,这可能不是做事情的最佳方式,但它是有效的。如果有人有更好的解决方案,请告诉我。在动态创建row命令后,我终于能够让它启动了。这是我的解决方案,尽管我不能说这是最好的方式:
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
}
}
现在,我不再等待按钮点击事件,而是检查按钮是否被点击。如果是,那么我知道用户希望我加载数据并显示它。目前在上面的代码中,我只是在同一个函数中生成和显示数据(这是一个糟糕的设计,但我只是简单地进行了原型设计)
然后,每当用户单击任何会导致回发的内容时,它都会将表添加到控件中。然后控制装置就可以启动了(我不知道为什么或者如何启动,但它可以工作……)
只是为了表明我们甚至不需要按钮功能:
public void Button1_Click(object sender, EventArgs e)
{
//randomGridView(Table1, 1);
//randomGridView(Table2, 4);
//Session.Add("doIt",true);
}
同样,这可能不是做事情的最佳方式,但它是有效的。如果有人有更好的解决方案,请告诉我。您是否可以添加一些伪代码或链接?我只需要找出一个起点,除了你现在正在做的事情,你还需要做两件事。1.将ID值添加到在randomGridView中创建的网格中。调用FindControl时需要此ID值(步骤2)。2.在页面加载事件处理程序中,选中IsPostback。如果为true,则调用添加网格的控件的FindControl方法(这可能是页面本身?我无法从代码中判断),传递所创建网格的ID值。将返回的对象强制转换为GridView,然后使用回答中的代码添加RowCommand事件处理程序。我创建一行,然后创建多个单元格(其中包含GridView)并将它们添加到行中。出于某种原因,它说我的表在回发时没有值。每当我尝试
GridView temp=(GridView)Table2.Rows[0].Cells[0].FindControl(“GridView 1”)代码>您可以添加一些伪代码或链接吗?易居