2

おそらくかなり頻繁に見られる問題に遭遇しましたが、ここで実際に議論されたことはありません。

私のGuiでは、forループのコントロールをFlowpanellayoutに追加しています。ポイントは、データベースから「レポート」を表示することです。レポートの数は日によって異なる可能性があるため、動的である必要があります。


Gui 要素を追加する疑似コード:

for(int i = 0; i < reports.Count; i++)
{
    TextBox textboxPerson = new TextBox();
    textboxPerson.Name = "TextboxName" + i;
    textboxPerson.Text = reports[i].Name;
    textboxPerson.TextChanged += new EventHandler(this.textboxPerson_TxtChanged);

    Label labelToChange = new Label();
    labelToChange.Name = "label"+i;
    labelToChange.Text = "";

    flowlayoutPanel.Controls.Add(textboxPerson);
    flowlayoutPanel.Controls.Add(labelToChange);
}

イベントハンドラ:

private void textboxPerson_TextChanged(object sender, EventArgs e)
{
   //So far, I'm only getting the number of the Textbox that changed.
}

ここで、あなたのアドバイスが必要です。Textbox と Label は一致しています (つまり、Texbox1 は Label1 に接続されていることがわかります)。しかし、特定の 1 つのコントロールにどのように対処すればよいでしょうか?

  • Texbox1 の Text が変更された場合、Label1 に対処してその Text などを変更するにはどうすればよいですか?
  • 動的な Gui 要素をフォームに追加して処理する最先端の技術はありますか?
4

4 に答える 4

3

Tagたとえば、コントロールのプロパティを使用できます。ループでは、次のようLabelに を のTagプロパティに割り当てることができます。TextBox

TextBox textboxPerson = new TextBox();
// do the stuff with the text box

Label labelToChange = new Label();
// do the stuff with the label
textboxPerson.Tag = labelToChange

Label次に、次のTextChanged場合に にアクセスできますTextBox

private void textboxPerson_TextChanged(object sender, EventArgs e)
{
   //So far, I'm only getting the number of the Textbox that changed.
   Label theLabel = (sender as TextBox).Tag;
   theLabel.Text = "whatever should go here";
}
于 2009-07-15T07:42:56.063 に答える
2

特定のケースでは、データバインディングを使用LabelしてTextBox:にリンクできます。

for (int i = 0; i < reports.Count; i++) {
  TextBox textboxPerson = new TextBox();
  textboxPerson.Name = "TextboxName" + i;
  textboxPerson.Text = reports[i].Name;
  //textboxPerson.TextChanged += new EventHandler(this.textboxPerson_TxtChanged);

  Label labelToChange = new Label();
  labelToChange.Name = "label" + i;
  labelToChange.Text = "";

  // this will update labelToChange.Text whenever textboxPerson.Text changes
  labelToChange.DataBindings.Add("Text", textboxPerson, "Text");

  flowlayoutPanel.Controls.Add(textboxPerson);
  flowlayoutPanel.Controls.Add(labelToChange);
}

TextChangedこれを使用すれば、イベントを処理する必要もありません

于 2009-07-15T07:50:45.830 に答える
2

TextBox と Label をグループ化する独自の小さな UserControl を作成することを考えることができます。これは、生成されたコントロール セットが大きくなる場合 (たとえば、ボタンを 1 つまたは 2 つ追加する場合) に特に便利です。

よろしくお願いします

于 2009-07-15T07:44:48.773 に答える
0

イベント ハンドラで次のようにします。

string labelName = ((Control)sender).Name.Replace("TextboxName","label");
Label [] labels = FlowlayoutPanel.Controls.Find(labelName,false);
if (labels.Length > 0)
    labels[0].Text = "This is your attached label";
于 2009-07-15T08:00:41.893 に答える