各位帮忙解决动态生成列的问题?
我在datagrid里动态生成一按钮列反馈,代码如下:
DataGrid1.AutoGenerateColumns=false;
ButtonColumn col1=new ButtonColumn();
col1.HeaderText="反馈";
col1.Text="反馈";
col1.CommandName="btn";
DataGrid1.Columns.Add(col1);
然后在
private void DataGrid1_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
if(((LinkButton)e.CommandSource).CommandName=="btn")
{
Response.Write("<script>alert(\"提交成功\");</script>");
}
}
就是不可以,而且原来生成的两列也没了,请各位帮我解决一下,比较急。
这几天有几人在问类似的问题,“动态加载控件,为什么控件事件不能触发了?”,问题是他们都是在
if (!IsPostBack)
{
//动态产生或装载控件
//也许需要连接控件事件处理函数
//加到父控件的Controls
}
里生成或装载了动态控件。当控件在客户端触发,postback到服务器端时,IsPostBack==true,这些控件没有被重新生成,怎么能触发事件?所以答案是,当你需要动态生成或装载控件时,应该在if (!IsPostBack)之外做。我问为什么想在if (!IsPostBack)之内做呢?回答是想只生成一次,跟在ASPX页面里一样
<form id="form1" runat=server>
<asp:Button id="Button1" runat="server" Text="Button1" OnClick="Button_Click"/>
#%&%#&%^#&,你怎么会认为这个控件只生成一次呢?这些玩意也不是魔术,想生成一个Button对象,你需要用
Button btn = new Button();
需要触发它的Click事件,你需要用
btn.Click += new EventHandler(YourHandler);
即使象包含
<asp:Button id="Button1" runat="server" Text="Button1" OnClick="Button_Click"/>
的页面,它也是被转化成C#或VB文件,编译成assembly,然后再被执行的啊
不信?加一个页面,TestControls.aspx:
<%@ Page Debug="true" %>
<%@ Import Namespace="System.Data"%>
<%@ Import Namespace="System.Data.SqlClient"%>
<form id="form1" runat=server>
<asp:Button id="Button1" runat="server" Text="Button1" OnClick="Button_Click"/>
<asp:DataGrid id="DataGrid1" runat="server" AutoGenerateColumns="false" GridLines="Both">
<Columns>
<asp:TemplateColumn HeaderText="Name">
<ItemTemplate><%# DataBinder.Eval(Container.DataItem,"Name")%></ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:DataGrid>
</form>
<script language="C#" runat="server">
void Button_Click(Object sender, EventArgs e)
{
Button btn = (Button)sender;
Response.Write(btn.Text + " is clicked<BR>");
}
void Page_Load(Object sender, EventArgs e)
{
Button btn = new Button();
btn.ID = "Button2";
btn.Text = "Button2";
btn.Click += new EventHandler(Button_Click);
form1.Controls.Add(btn);
if (!IsPostBack)
{
SqlDataAdapter da = new SqlDataAdapter("select Name=au_fname + ' ' + au_lname from authors", "server=localhost;database=pubs;uid=sa;pwd=;");
DataTable dt = new DataTable();
da.Fill(dt);
DataGrid1.DataSource = dt.DefaultView;
DataGrid1.DataBind();
}
//}//这是故意的
</script>
把最后一个“}”注释掉,然后在浏览器里向你的服务器调用TestControls.aspx
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Put user code to initialize the page here
add()
If Not IsPostBack Then
Dim d As New Data
DataGrid1.DataSource = d.CreateDataSource
DataGrid1.DataBind()
End If
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
End Sub
Sub add()
DataGrid1.AutoGenerateColumns = False
Dim col1 As New ButtonColumn
col1.HeaderText = "反馈"
col1.Text = "反馈"
col1.CommandName = "btn"
DataGrid1.Columns.Add(col1)
Dim d As New Data
DataGrid1.DataSource = d.CreateDataSource
DataGrid1.DataBind()
End Sub
Private Sub DataGrid1_ItemCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles DataGrid1.ItemCommand
If e.CommandName = "btn" Then
Response.Write("<script>alert('提交成功');</script>")
End If
End Sub