5

C# Winform のパネルに多数のテキスト ボックスがあります。テキスト ボックスの各行には、次のような名前が付けられます。


tb1 tbNickName1 コンボボックス1 tb2 tbニックネーム 2 コンボボックス
2 tb3 tbニックネーム 3 コンボボックス 3

等々。

テキスト ボックスの各行の横にボタンがあります。しかし、ボタンがボタンごとに異なるイベントを指すようにするのではなく、ボタンを button1_Click イベントだけを指すようにし、そこですべての処理を行うようにしたいと考えています。私はこれを行う方法を知っており、すべてのボタンが button1_Click イベントを指しています。

しかし、どのボタンから呼び出されたのかを判断できる必要があります (これは可能です)。ただし、イベント内のテキスト ボックスの名前を操作して、現在の行に基づいて処理を実行できるようにする必要があります。 /ボタンから呼び出しています。

たとえば、tb2 tbNickName2 コンボ ボックス 2 テキスト ボックスがある行番号 2 にいる場合、button1_Click イベントにこれを認識させ、tb2 tbNickName2 コンボ ボックス 2 の値を以下の例で使用する tmp 変数に自動的に割り当てる必要があります。 .

private void button1_Click(object sender, EventArgs e)
{
       Button bt = (Button) sender; //will return 'button1'

       string tmpEmail = null;
       string tmpNickName = null;
       string tmpGroup = null;

       //I don't want to hard code the tb1.Text value here, I want to have
       // the namechange based on which (Button) sender it was called from.

       // For example button1 should assign all the
       // tb1    tbNickName1   comboBox1 values

       //If called from button2, then it should assign the
       //tb2    tbNickName2   comboBox2 values instead

       //How can I do this so tb1.Text is based off of the button # that I am 
       //calling for example tb(bt).Text would be cool but that does not work.

       tmpEmail = tb1.Text; //What do I change tb1.Text to based on button #?

       tmpNickName = tbNickName1.Text; //What do I change tbNickName1.Text to?

       tmpGroup = comboBox1.Text;//What do I change comboBox1.Text to?
}


これをうまく説明できていないことは承知していますが、私にできる最善のことです。

4

4 に答える 4

1

次のようなことができます (パネル内のコントロールを反復処理):

   //Get the number of the button control (last digit of the name)
   string strNum = bt.Name.Substring(bt.Name.Lenght -2);
   foreach(Control ctrl in myPanel.Controls)
    {
        if(ctrl is ComboBox) {
           if(ctrl.Name.EndsWith(strNum)) {
             //Do Something with your found ComboBox ...
            }
         }
    }

コードはテストされていませんが、アイデアが得られるはずです...

于 2012-10-21T08:18:15.977 に答える
1
Button button = sender as Button;
string buttonIndex = button.Name.Substring(6);
string tempEmail = (this.Controls["tb" + buttonIndex] as TextBox).Text;
string tmpNickName = (this.Controls["tbNickName" + buttonIndex] as TextBox).Text;
string tmpGroup = (this.Controls["comboBox" + buttonIndex] as ComboBox).Text;
于 2012-10-21T08:27:37.103 に答える
0

ボタンに、次のような CommandArgument-Property を追加します。

bt1.CommandArgument = "1";
bt2.CommandArgument = "2";

EventHandler で CommandArgument を読み取り、それに応じて動作します。

 private void button1_Click(object sender, EventArgs e)
    {
        Button bt = (Button) sender;
        if(bt.CommandArgument == "1") {
            // bt1 was clicked, handle stuff accordingly
        } else if(bt.CommandArgument == "2") {
            // bt2 was clicked..
        } else {
            //handle rest of possible cases
        }
    }

これは疑似コードにすぎませんが、これがどこに向かっているのかがわかると思います。ただし、変数の命名は最適とはほど遠いことに注意してください。変数とコントロールには、数字で名前を付けるのではなく、あらゆる種類の情報を提供する名前を選択してください。後でコードを見て理解しようとする場合、これは非常に役立ちます。このように、意味のある CommanArgument 値も見つけてみてください。

于 2012-10-21T08:15:42.307 に答える
-1

まず、あなた自身、私たち、そしてあなたのコードを見たことのある人のために、命名規則を変更してください。

解決策としては、チェックボックスとテキスト ボックスへの参照を作成時に辞書に入れることをお勧めします。で使用したキーをボタンに含めますCommandArgument。これで、辞書にアクセスして行を取得できます。

たとえば、コンストラクターで、次のようなものを追加します

_rowDictionary = new Dictionary<string, Row> {
    { "identifier of first line", new Row { descriptiveNameOfFirstTextBox, descriptiveNameOfFirstTextBox, descriptiveNameOfButton } },
    // ...
};
descriptiveNameOfButton.CommandArgument = "identifier of first line";

次に、イベントハンドラーで

Button senderButton = (Button) sender;
Row r = _rowDictionary[senderButton.CommandArgument];

ここでは、いくつかのコンテナ クラスを使用しましRowた。あなたはそれを必要としないかもしれません

class Row {
    TextBox textBoxForInputOfA { get; set; }
    TextBox textBoxForInputOfB { get; set; }
    Button buttonForDoingWhatItDoes { get; set; }
}
于 2012-10-21T08:21:05.270 に答える