0

ページにボタンを動的に追加したい。これは、SELECT ステートメントからの結果の数によって異なります。私

   protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            for (int i = 0; i < Query.length; i++)
            {
                 Button btn = new Button();
                 btn.ID = "Button" + i;
                 btn.Click += new EventHandler(btn_Click());
                 btn.Text = i.ToString();
                 pagingPanel.Controls.Add(btn);
           }
        }
    }

しかし、各ボタンには独自のカスタム イベント ハンドラが必要です。あるボタンをクリックすると、別のボタンをクリックした場合とは異なる結果が得られます。追加のパラメーターを渡すことができる場所で、次のようなことをしたいと思います。

protected void btn_Click(object sender, EventArgs e, string test)
{
    System.Diagnostics.Debug.WriteLine(test);
}

おそらく、どのオブジェクトを渡せばよいかわからないのでしょうか? あるいは、私はこれに間違った方法で取り組んでいるのかもしれません。

望ましい結果を得るにはどうすればよいですか?

4

4 に答える 4

2

これを試して:

protected void Page_Load(object sender, EventArgs e)
{
        // you do not use !IsPostBack here
        //count of func must be equal with 'Query.Length'
        string[,] arr ={
                         {"func1","hello world"},
                         {"func2","Hello ASP.NET"}
                     };
        for (int i = 0; i < Query.Length; i++)//I assume length is 2
        {
             Button btn = new Button();
             btn.ID = arr[i, 0];
             btn.CommandArgument = arr[i, 1];
             btn.Click += new EventHandler(btn_Click);
             btn.Text = i.ToString();
             pagingPanel.Controls.Add(btn);
       }
}
protected void btn_Click(object sender, EventArgs e)
{
    Button btn = (Button)sender;
    System.Reflection.MethodInfo methodInfo = typeof(_Default2).GetMethod(btn.ID); //_Default2 is class name of code behind
    if (methodInfo != null)
    {
        object[] parameters = new object[] { btn.CommandArgument};
        methodInfo.Invoke(this,parameters);
    }
}
public void func1(object args)
{
    string test = args.ToString();
    Response.Write(test);
}
public void func2(object args)
{
    string test = args.ToString();
    Response.Write(test);
}
于 2013-09-19T02:33:12.070 に答える
1

何よりもまず、ポストバックであるかどうかにかかわらず、ボタンを作成する必要があります。ボタンがない場合、ボタンのクリックがポストバックの理由です - 何がクリックされますか?

次に、ページ クラスに追加します。

Dictionary<Button, ButtonInfo> fButtonLookup = new Dictionary<Button, ButtonInfo>();

次に、ボタンを作成する場所:

fButtonLookup.Clear();
for (int i = 0; i < Query.length; i++)
{
  Button btn = new Button();
  fButtonLookup.Add(btn, new ButtonInfo() { whatever information about this button you want to keep});
  ...
}

次に、ボタンをクリックします。

protected void btn_Click(object sender, EventArgs e)
{
  Button btn = (Button)sender;
  if (fButtonLookup.ContainsKey(btn))
  {
    ButtonInfo info = fButtonLookup[btn];
    // do waht you need with button information
  }
}
于 2013-09-19T03:02:39.563 に答える
0

senderどのボタンがクリックされたかを確認するだけです。

protected void btn_Click(object sender, EventArgs e)
{
    if (sender == btnOne)
        performBtnOne("foo");
    else if (sender == btnTwo)
        performButtonTwo("bar");
}
于 2013-09-18T21:38:35.380 に答える