События, которые не запускаются их кнопками - PullRequest
2 голосов
/ 15 июня 2011

Я сгенерировал две кнопки и поместил их в список кнопок ..

       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, и веб-приложение не достигает этого.

Все, что меня беспокоит, это то, почему кнопки не привязаны к методу обработки событий, который я им дал ... почему, когда я устанавливаю точку останова в том случае, если она никогда не срабатывает.

Что должно произойти, когда кнопка нажата ... событие должно быть инициировано первым, а страница должна загрузиться второй. Но этого не происходит ... что происходит, если событие кнопки пропускается, а событие загрузки страницы запускается при каждом постбэке после нажатия кнопки ...

Обновлен:

    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);

        }


    }
}

Рабочий код выше ..

Я протестировал, сохранив список кнопок с сессией. Здесь я воссоздаю кнопки на 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();
        }
    }

Ответы [ 6 ]

2 голосов
/ 15 июня 2011

Это pgs.Command += obtainTopicsPerPage_Click; должно быть pgs.Command += new CommandEventHandler(obtainTopicsPerPage_Click);

Вы не правильно добавили обработчик команд new CommandEventHandler(obtainTopicsPerPage_Click);

Редактировать: Поскольку вы добавляете динамические элементы управления, на странице загрузки ваш код должен быть выполнен снова, чтобы вызвать событие.

2 голосов
/ 15 июня 2011

Вы уверены, что используете правильное событие? Разве вы не должны использовать Button.Click ?

1 голос
/ 15 июня 2011

Нет ничего плохого в использовании 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;)) Good grief...

0 голосов
/ 15 июня 2011

Это работает для меня и, надеюсь, даст вам представление. Я знаю, что это очень упрощенно, но следует из того, что вы предоставили. Когда вы нажимаете кнопки, страница перезагружается, поэтому заново создаете кнопки и настраиваете все заново. Чтобы избежать этого, проверьте, что Page.IsPostBack имеет значение false.

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>
0 голосов
/ 15 июня 2011

Исходя из сказанного другими авторами.

Вы можете попробовать следующее:

pgs.Click += obtainTopicsPerPage_Click;

И убедиться, что установленный код находится в событиях PreInit или PreRender.

0 голосов
/ 15 июня 2011

Где вы создаете кнопки? Возможно, это не то место. Смотрите здесь: http://msdn.microsoft.com/en-us/library/ms178472.aspx

Попробуйте в PreInit, как следует из документации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...