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を取得します。ボタン配列 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;
        }
4

3 に答える 3

6

@AVD がコメントしたように、sender オブジェクトをキャストするポストバックを発信するボタンを取得できます。また、ボタン オブジェクトから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();
    }

これにより、次のものが生成されました。

ここに画像の説明を入力

于 2012-06-16T08:03:32.350 に答える
2

パネルで最後にクリックされたオブジェクトの名前を取得するにはどうすればよいですか?

クリック ハンドラーの最初のパラメーターは、イベントを発生させたコントロール/オブジェクトの参照を返します。

public void buttonHandler(object sender, EventArgs e)
{
   Button btn=sender as Button;
   ....
}
于 2012-06-16T07:41:24.010 に答える
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;
           }

        }

みんな、ありがとう!

于 2012-06-16T09:15:14.560 に答える