Динамическое добавление кнопки команды в ASP.NET - PullRequest
2 голосов
/ 02 апреля 2011

У меня есть страница с динамически создаваемой командной кнопкой.

Мне нужно динамически подключить событие щелчка, чтобы я мог получить CommandArgument нажатой кнопки.

Button b = new Button();
b.ID = "btnTrigger2";
b.CssClass = "hiddenBtn";
b.CommandName = "lbl3";
b.Click += new EventHandler(btnTrigger_Click);

проблема в последней строке - я не могу подключить EventHandler таким образом - мне нужно использовать стандартные EventArgs вместо CommandEventArgs.

У кого-нибудь есть какие-либо предложения о том, как заставить это работать?Должен быть способ ...

РЕДАКТИРОВАТЬ

Я решил опубликовать код, который наконец заработал, если кто-то еще попытается сделать то же самое.

`string tabLoadedScript = string.Empty;string postBackScript = string.Empty;

string script = " <script language='javascript' type='text/javascript'>" + System.Environment.NewLine;
script += "function clientActiveTabChanged(sender, args) {" + System.Environment.NewLine;


int i = 0;

foreach(TabPanel tp in tc1.Tabs)
    {
    Button b = new Button();
    b.ID = "btn" + tp.ClientID;
    b.CssClass = "hiddenBtn";
    b.CommandName = tp.ID;
    b.Command += btnTrigger_Click;
    this.form1.Controls.Add(b);
    AsyncPostBackTrigger trg = new AsyncPostBackTrigger();
    trg.ControlID = "btn" + tp.ClientID;

    tabLoadedScript += "var isTab" + tp.ClientID + "loaded=$get('" + tp.Controls[0].ClientID + "');" + System.Environment.NewLine;
    postBackScript += "if(!isTab" + tp.ClientID + "loaded && sender.get_activeTabIndex() == " + i + ") {" + System.Environment.NewLine;
    postBackScript += "__doPostBack('" + b.ClientID + "','');}" + System.Environment.NewLine;
    i++;
    }
script += tabLoadedScript;
script += postBackScript;
script += "}" + System.Environment.NewLine;
script += "</script>";

this.ClientScript.RegisterClientScriptBlock (this.GetType (), "cs", script, false);

защищенный void btnTrigger_Click (отправитель объекта,CommandEventArgs e) {System.Threading.Thread.Sleep (2500);Panel ctrl = (Panel) FindControlRecursive (this, "pnl" + e.CommandName);ctrl.Visible = true;}

public static Control FindControlRecursive(Control Root, string Id)
    {

    if(Root.ID == Id)
        return Root;

    foreach(Control Ctl in Root.Controls)
        {

        Control FoundCtl = FindControlRecursive(Ctl, Id);
        if(FoundCtl != null)
        return FoundCtl;

        }
    return null;

    }

`

Ответы [ 2 ]

2 голосов
/ 02 апреля 2011

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

Что-то вроде:

protected void btnTrigger_Click(object sender, EventArgs e)
{
  Button btnTrigger = sender as Button;
  String commandArgument = btnTrigger.CommandArgument;
  .
  .
  .
  .
  //Other code....

}
1 голос
/ 02 апреля 2011

Вам нужно использовать событие Command вместо события Click.Кроме того, если вы используете последнюю версию Visual Studio и .Net, вы можете просто изменить регистрацию события с

b.Click += new EventHandler(btnTrigger_Click);

на

b.Command += btnTrigger_Click

Явная типизация делегатаявляется избыточным и будет выведен компилятором.Теперь вы можете изменить сигнатуру вашего обработчика событий на:

protected void btnTrigger_Click(object sender, CommandEventArgs e)

И код должен работать как нужно.

К сожалению, фрагменты кода по умолчанию в Visual Studio по-прежнему генерируют этот старый стилькод прослушивателя событий.

...