各位帮忙解决动态生成列的问题?

我在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>");

}
}
就是不可以,而且原来生成的两列也没了,请各位帮我解决一下,比较急。
[561 byte] By [killbillnet-.net杀手] at [2008-2-16]
# 1
你的datagrid可能没有绑定
dxphero-火鸟hero at 2007-11-1 > top of Msdn China Tech,.NET技术,ASP.NET...
# 2
当然是绑定的了。。难道没人回答
killbillnet-.net杀手 at 2007-11-1 > top of Msdn China Tech,.NET技术,ASP.NET...
# 3
先帮你UP!
再帮你想想
jamzh-Showmethemoney!!! at 2007-11-1 > top of Msdn China Tech,.NET技术,ASP.NET...
# 4
我加了这段代码,但新增的也不显示,原有的就还在
如果你是这样写
if(((LinkButton)e.CommandSource).CommandName=="btn")
我觉得你应该在声明下ButtonColumnType=LinkButton
我再看看!
jamzh-Showmethemoney!!! at 2007-11-1 > top of Msdn China Tech,.NET技术,ASP.NET...
# 5
you need to recreate the button column upon postback, see

DataGrid Web 伺服器控制項的常見問題
http://www.microsoft.com/taiwan/msdn/library/2002/Feb-2002/whitepaper/vbtchtopquestionsaboutaspnetdatagridservercontrol.htm

saucer-思归 at 2007-11-1 > top of Msdn China Tech,.NET技术,ASP.NET...
# 6
这几天有几人在问类似的问题,“动态加载控件,为什么控件事件不能触发了?”,问题是他们都是在

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
# 7
先添加这段代码,然后再绑定数据就可以了!
DataGrid1.AutoGenerateColumns=false;
ButtonColumn col1=new ButtonColumn();
col1.HeaderText="反馈";
col1.Text="反馈";
col1.CommandName="btn";
DataGrid1.Columns.Add(col1);

DataGrid1.DataSource=Lists.GetMarry();
DataGrid1.DataBind();
jamzh-Showmethemoney!!! at 2007-11-1 > top of Msdn China Tech,.NET技术,ASP.NET...
# 8
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
# 9
你把新增的功能放在pageload中 每次刷新都生成一个
# 10
谢谢goody9807,我试试看
killbillnet-.net杀手 at 2007-11-1 > top of Msdn China Tech,.NET技术,ASP.NET...