1

データベースからデータをフェッチし、5 つのテキスト ボックスと 1 つのボタンを 1 行に動的に作成する C# アプリケーションを作成しています。

データベースに存在する行数は、作成される te​​xtBoxes およびボタンの行数と同じです。

textBoxes とボタンの行を正常に作成できました。textBoxes は、データベースからフェッチされているデータを表示することもできます。

しかし、私の問題は、生成されたボタンがクリックされても何もしないということです。これは、クリック イベントを処理するハンドラーを作成していないため、予期しないことではありません。しかし、再び動的に生成されるボタンのクリックイベントハンドラーを動的に作成する方法について混乱しています。

以下は、テキスト ボックスとボタンを生成するコード サンプルです。

for (int i = 3; i <= count; i++)
{
    com.Parameters[0].Value = i;
    using (SqlCeDataReader rd = com.ExecuteReader())
    if (rd.Read())
    {
        pname = (rd["pname"].ToString());
        cname = (rd["cname"].ToString());
        budget = (rd["budget"].ToString());
        advance = (rd["advance"].ToString());
        ddate = (rd["ddate"].ToString());

        TextBox tobj = new TextBox();
        tobj.Location = new Point(10, (40 + ((i - 2) * 20)));
        tobj.Tag = 1;
        tobj.Text = pname;
        tobj.AutoSize = false;
        tobj.Width = 150;
        tobj.ReadOnly = true;
        this.Controls.Add(tobj);

        TextBox tobj1 = new TextBox();
        tobj1.Location = new Point(160, (40 + ((i - 2) * 20)));
        tobj1.Tag = 2;
        tobj1.Text = cname;
        tobj1.AutoSize = false;
        tobj1.Width = 150;
        tobj1.ReadOnly = true;
        this.Controls.Add(tobj1);

        TextBox tobj2 = new TextBox();
        tobj2.Location = new Point(310, (40 + ((i - 2) * 20)));
        tobj2.Tag = 3;
        tobj2.Text = budget;
        tobj2.AutoSize = false;
        tobj2.Width = 100;
        tobj2.ReadOnly = true;
        this.Controls.Add(tobj2);

        TextBox tobj3 = new TextBox();
        tobj3.Location = new Point(410, (40 + ((i - 2) * 20)));
        tobj3.Tag = 4;
        tobj3.Text = advance;
        tobj3.AutoSize = false;
        tobj3.Width = 100;
        tobj3.ReadOnly = true;
        this.Controls.Add(tobj3);

        TextBox tobj4 = new TextBox();
        tobj4.Location = new Point(510, (40 + ((i - 2) * 20)));
        tobj4.Tag = 5;
        tobj4.Text = ddate;
        tobj4.AutoSize = false;
        tobj4.Width = 100;
        tobj4.ReadOnly = true;

        int due = 0;
        due = int.Parse(ddate);
        if (due < 5)
        {
             tobj4.BackColor = System.Drawing.Color.Red;
        }

        this.Controls.Add(tobj4);

        Button button = new Button();
        button.Left = 620;
        button.Tag = i;
        button.Height = 20;
        button.Text = "Details";
        button.Top = (40 + ((i - 2) * 20));
        this.Controls.Add(button);  
    }
}

クリック イベント ハンドラを生成する方法についてのアイデアを教えてください。

4

2 に答える 2

5

回答部分:

これを追加:

button.Tag = i;
button.Click += handleTheClick;

...

private void handleTheClick(object sender, EventArgs e){
    Button btn = sender as Button;
    int row = (int)btn.Tag;
}

未回答:

設計を再考する必要があります。データ処理コードに座標を含めることは、2013 年には非常に悪い考えです。ListView、ListBox、GridView などを使用してみてください。WPF に切り替えてください。

于 2013-01-07T16:38:38.983 に答える
4

Clickイベントにサブスクライブする必要があります。

button.Click += ... some event handler ...

ハンドラーのメソッドを使用できます。

button.Click += MyEventHandlerMethod;

// put this method somewhere in your Form class
void MyEventHandlerMethod( object sender, EventArgs args )
{
  ...

またはラムダでさえ:

button.Click += ( s, e ) => HandleClick( ... any parameters here ... );

// put this method somewhere in your Form class
void HandleClick( ... required parameters ... )
{
  ...

ヒントとして、.designer.cs通常のフォームのファイルを調べて、どのように処理されているかを確認できます。

于 2013-01-07T16:37:29.983 に答える