События кликов на массиве кнопок
Как я могу получить название объекта, который последний раз щелкнул на панели? Хитрость в том, что на панели есть большой набор кнопок (btn[1] ... btn [200]). Как я могу проверить, нажал ли я кнопку b[180] или b[11] или даже за пределами панели (без кнопки)? Также кнопки генерируются при загрузке страницы посредством кодирования. Спасибо. Анна
РЕДАКТИРОВАТЬ: Спасибо! Другая проблема, которая возникла (это породило ссылку на объект NULL): у меня есть метод на том же уровне, что и buttonHandler (), он называется HowManyClicked() и вызывается из buttonHandler (). Внутри HowManyClicked() я хочу идентифицировать Button btn1 = Panel2.FindControl(x) как Button; где x - это, например, buttonArray[2,3]. Но я всегда получаю NULL. Является ли массив кнопок buttonArray не идентифицируемым по имени из метода, который его сгенерировал?
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 ответа
Как прокомментировал @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" />
Этот код генерирует что-то вроде:
В качестве дополнительного примечания Microsoft рекомендует создавать динамические элементы управления в PreInit
событие или, если вы используете главную страницу, в Init
событие
отредактированный
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();
}
Это произвело:
Как я могу получить название объекта, который последний раз щелкнул на панели?
Первый параметр обработчика щелчка возвращает ссылку элемента управления / объекта, вызвавшего событие.
public void buttonHandler(object sender, EventArgs e)
{
Button btn=sender as Button;
....
}
Я только что нашел другое исправление, просто переопределив 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;
}
}
Спасибо всем!