我生成了两个按钮并将它们放入按钮列表中。
List<Button> buttons = new List<Button>();
Button pgs=new Button
for(int i=0;i<2;i++)
pgs.Width = 20;
pgs.Command += obtainTopicsPerPage_Click;
pgs.CommandName = i.ToString();
pgs.Text =i.ToString();
btns.Add(tPage.ToString());
buttons.Add(pgs);
我将按钮添加到占位符,它们显示在页面上。
他们拥有的事件如下:
void obtainTopicsPerPage_Click(Object sender, CommandEventArgs e)
{
foreach (var item in tPages)
{
if (item.Key == e.CommandName)
{
foreach (var posts in item.Value)
{
posts.ExecuteAll();
}
}
}
MyButtonTable();
}
函数的作用并不重要(它们只是创建表格并使其看起来像论坛页面中的帖子)..
现在,当用户点击屏幕上显示的任何一个按钮时......没有触发任何事件..我在eventhanlder方法中设置了一个断点,Web应用程序没有到达那里。
所有我担心的是为什么按钮没有附加到我给他们的事件处理方法..为什么当我在事件中设置断点时它永远不会触发。
当点击一个按钮时会发生什么......应该先触发事件,然后再加载页面。但是这没有发生..跳过按钮事件会发生什么,并且在按钮单击后每次回发都会触发页面加载事件。
更新:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class Default2 : System.Web.UI.Page
{
string[] d;
protected void Page_Load(object sender, EventArgs e)
{
d = new string[] { "dfadfas", "daads", "dasda", "dads" };
Buttons();
}
List<Button> btns;
public void Buttons()
{
btns = new List<Button>();
for (int i = 0; i < 20; i++)
{
Button d = new Button();
d.Text = "Click me";
d.Click += Me_Click;
btns.Add(d);
}
function();
}
public void function()
{
foreach (var item in btns)
{
PlaceHolder1.Controls.Add(item);
}
}
public int i { get{object o=ViewState["i"];return (o==null)?0:(int)o;} set{ViewState["i"]=value;} }
public void Me_Click(object sender, EventArgs e)
{
foreach (var item in d)
{
Label da= new Label();
da.Text = "d"+i+++"<br/>";
this.Controls.Add(da);
}
}
}
上面的工作代码..
我通过使用Session保存按钮列表进行了测试。在这里,我重新创建了PreInit的按钮
void Page_PreInit(object sender, EventArgs e)
{
List<Button> btn = (List<Button>)Session["Buttons"];//debugging shows 2 buttons
if (btn != null)
{
foreach (var item in btn)
{
item.Width = 20;
item.Command += obtainTopicsPerPage_Click;
item.CommandName = tPage.ToString();
item.Text = tPage.ToString();
}
}
答案 0 :(得分:2)
您确定使用的是正确的活动吗?你不应该使用Button.Click吗?
答案 1 :(得分:2)
此pgs.Command += obtainTopicsPerPage_Click;
应为pgs.Command += new CommandEventHandler(obtainTopicsPerPage_Click);
您未正确添加命令处理程序new CommandEventHandler(obtainTopicsPerPage_Click);
编辑:由于您要添加动态控件,因此在页面加载时应再次执行代码以触发事件。
答案 2 :(得分:1)
使用Command没有任何问题。
在新页面上尝试此操作作为起点,您应该看到Button1_Command事件抛出预期的异常。我当然这样做:)。
protected void Page_Load(object sender, EventArgs e)
{
Button pgs = new Button();
pgs.Command += Button1_Command;
Controls.Add(pgs);
}
void Button1_Command(object sender, CommandEventArgs e)
{
throw new NotImplementedException();
}
我怀疑代码中的其他地方存在问题但我们没有看到。请告诉我们更多与按钮等相关的代码。
顺便说一句,是的,它确实编译并运行(虽然我忘记了form1引用;))
答案 3 :(得分:0)
你在哪里创建按钮?这可能是错误的地方。见这里:http://msdn.microsoft.com/en-us/library/ms178472.aspx
根据文档建议,在PreInit
中试用。
答案 4 :(得分:0)
继续其他海报所说的话。
您可以尝试以下方法:
pgs.Click += obtainTopicsPerPage_Click;
确保设置代码在PreInit或PreRender事件中。
答案 5 :(得分:0)
这适合我,希望能给你一个想法。我知道它非常简单,但是从你提供的内容开始。当您单击按钮时,页面重新加载,因此重新创建按钮并再次设置所有内容。为了避免这种情况发生,请检查Page.IsPostBack是否为假。
public partial class GuessNumber : System.Web.UI.Page {
protected void Page_Load(object sender, EventArgs e) {
lblResult.Text += "Written in by Page_Load <br />";
}
protected void LoveMyButtons_click(object sender, EventArgs e) {
string response = txtGuess.Text;
lblResult.Text += string.Format("LoveMybuttons " + response + " <br />");
}
protected void Page_PreInit(object sender, EventArgs e) {
CreateButtons();
}
List<Button> btns;
public void CreateButtons() {
btns = new List<Button>();
for (int i = 0; i < 6; i++) {
Button butt = new Button();
butt.Text = "Click me";
butt.Click += LoveMyButtons_click;
btns.Add(butt);
}
AddMyButtonsToAPlaceHolder();
}
public void AddMyButtonsToAPlaceHolder() {
foreach (var item in btns) {
plhButtonStore.Controls.Add(item);
}
}
}
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="txtGuess" runat="server" />
<asp:Button ID="btnPeanut" runat="server" Text="Guess" />
<br /><br />
<asp:Label ID="lblNumberOfGuesses" runat="server" />
<br />
<asp:Label ID="lblResult" runat="server" />
<br />
<asp:PlaceHolder ID="plhButtonStore" runat="server" />
</div>
</form>
</body>