Вопрос по c#, asp.net, visual-studio-2008 – События кликов на массиве кнопок

1

Как я могу получить название объекта, который последний раз щелкнул на панели? Хитрость в том, что на панели есть большой набор кнопок (btn [1] ... btn [200]). Как я могу проверить, нажал ли я на кнопку b [180], b [11] или даже за пределами панели (без кнопки)? Также кнопки генерируются при загрузке страницы посредством кодирования. Спасибо. Анна

РЕДАКТИРОВАТЬ: Спасибо! Другая проблема, которая возникла (это породило ссылку на объект NULL): У меня есть метод на том же уровне, что и buttonHandler (), он называется HowManyClicked () и вызывается из buttonHandler (). Внутри HowManyClicked () я хочу идентифицировать Button btn1 = Panel2.FindControl (x) как Button; где x - это, например, buttonArray [2,3]. Но я всегда получаю NULL.Is the button array buttonArray not identifiable by name once out of the method that generated it??

        public void buttonHandler(object sender, EventArgs e)
        {
            Button btn = sender as Button;
            //string tt = btn.ToolTip.ToString();
            btn.BackColor = Color.Red;
            statusL.Text = HowManyClicked().ToString();

        }

        public int HowManyClicked()
        {
            int sum=0;
            for (int a = 0; a < 10; a++)
                for (int b = 0; b < 14; b++)
                {
                    string x = "buttonArray[" + a + ", " + b + "]";
                    statusL.Text = x;
                    Button btn1 = Panel2.FindControl(x) as Button;
                    if (btn1.BackColor == Color.Red) sum += 1;

                }
            return sum;
        }

Ваш Ответ

3   ответа
6

Как прокомментировал @AVD, вы можете получить кнопку, инициирующую обратную передачу, передающую объект отправителя, вы также можете использоватьCommandName а такжеCommandArgument свойства объекта кнопки (они обычно используются, когда кнопка находится внутриGrid, DataList и т.д., но вы можете использовать их в этом контексте, если вам нужно):

    protected void Page_Init(object sender, EventArgs e)
    {
        var s = Enumerable.Range(1, 10);
        foreach (var item in s)
        {
            var b = new Button();
            b.Text = "My Button " + item.ToString();
            b.CommandName = "custom command";
            b.CommandArgument = item.ToString();
            b.Click += new EventHandler(b_Click);
            this.myPanel.Controls.Add(b);
        }
    }

    void b_Click(object sender, EventArgs e)
    {
        var current = sender as Button;
        this.lblMessage2.Text = "Clicked from array buttons: <br/>Command Name: " + current.CommandName + "<br/>Args: " + current.CommandArgument + "<br/>Button Unique ID: " + current.UniqueID + "<br/>Client ID: " + current.ClientID;
    }

Страница:

<asp:Panel runat="server" ID="myPanel">
</asp:Panel>

<asp:Label ID="lblMessage2" runat="server" />

Этот код генерирует что-то вроде:

enter image description here

В качестве дополнительного примечания Microsoft рекомендует создавать динамические элементы управления вPreInit событие или, если вы используете главную страницу, вInit событие

источник

Edited
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!this.IsPostBack)
        {
            this.ViewState["count"] = 0;
        }

    }


    protected void Page_Init(object sender, EventArgs e)
    {
        var s = Enumerable.Range(1, 10);
        foreach (var item in s)
        {
            var b = new Button();
            b.Text = "My Button " + item.ToString();
            b.Click += new EventHandler(buttonHandler);
            this.myPanel.Controls.Add(b);
        }
    }

    void buttonHandler(object sender, EventArgs e)
    {
        // update here your control
        var b = sender as Button;
        b.BackColor = Color.Red;
        HowManyClicked();
    }

    private void HowManyClicked()
    {
        var c = (int)this.ViewState["count"];
        c++;
        this.ViewState["count"] = c;
        this.lblMessage2.Text = "Clicked controls: " + this.ViewState["count"].ToString();
    }

Это произвело:

enter image description here

ОК, я думаю, я понял, см. Мой обновленный ответ
Большое спасибо, Юпанол. Еще одна вещь: у меня есть метод на том же уровне, что и buttonHandler (), он называется HowManyClicked () и вызывается из buttonHandler (). Внутри HowManyClicked () я хочу идентифицировать Button btn1 = Panel2.FindControl (x) как Button; где x - это, например, buttonArray [2,3]. Но я всегда получаю NULL. Является ли массив кнопок buttonArray не идентифицируемым по имени из метода, который его сгенерировал: PopulateControls ?? Anna T
Отлично, большое спасибо, Юпанол! Я просто нашел другой способ сделать это: public int HowManyClicked () {int sum = 0; foreach (управление cnt в this.Panel2.Controls) if (cnt is Button) {Button btn = (Button) cnt; if (btn.BackColor == Color.Red) sum + = 1;} возвращаемая сумма; }} Anna T
Хорошо, HowManyClicked () предназначен для вычисления / обновления после каждого нажатия, сколько кнопок было нажато в общей / общей сумме. Вот почему я не использовал параметры для сигнатуры метода. Это скорее общий запрос, не относящийся к кнопке. Anna T
Почему бы вам просто не передать в качестве параметраHowManyClicked кнопка отbuttonHandler как этоHowManyClicked(Button button) а такжеbuttonHandler{HowManyClicked(sender as Button)}
0

Я только что нашел другое исправление, просто переопределив HowManyClicked (), поэтому я добавляю его здесь ниже. Еще не уверен, почему первый метод (тот, что в моем вопросе) не сработал. Вот оно:

public int HowManyClicked()
        {
            int sum=0;
            foreach (Control cnt in this.Panel2.Controls)
                if (cnt is Button)
                {
                    Button btn = (Button)cnt;
                    if (btn.BackColor == Color.Red)
                        sum += 1;
                }
            return sum;
           }

        }

Спасибо всем!

2

How can I get the name of the object last clicked on a panel?

Первый параметр обработчика щелчка возвращает ссылку элемента управления / объекта, вызвавшего событие.

public void buttonHandler(object sender, EventArgs e)
{
   Button btn=sender as Button;
   ....
}

Похожие вопросы