1

私は自分のwinformに を持っていて、 ボタンusercontrolをクリックするたびに(実行時に)複数のユーザーコントロールを作成します。また、winform には単純な textbox があります。ユーザーコントロールを選択すると、動的テキストボックスのテキストが単純なテキストボックスにも表示されます。私のコードでは、ユーザーコントロールのテキストボックスが現在のコンテキストにないと言われています。私のコード:usercontroltextbox

private void Gettext()
{
    int i = 0;
    Control[] txt = Controls.Find("txtBox" + i.ToString(), true);//here I search for the dynamical textbox
    foreach (Control c in panel1.Controls)
    {
        if (c is UserControl1) 
        {
            if (((UserControl)c).Selected)
                 txtSimple.Text= txtBox[0].Text ;
        }
        i++;
    }
4

4 に答える 4

1

で Selected イベントが必要ですUserControl

    //in UserControl
    public event EventHandler Selected;

    private void textBox1_MouseClick(object sender, MouseEventArgs e)
    {
        if(Selected!=null)
            Selected(this,null);
    }

動的に作成するときに、UserControl の Selected イベントをサブスクライブするようになりました。このような:

    UserControl control = new UserControl();
    control.Selected += myControl_Selected;


    private void myControl_Selected(object sender, EventArgs e)
    {
        UserControl control = (UserControl)sender;
        textBox2.Text = control.Text;
    }

これが役立つことを願っています。

于 2013-04-05T13:24:00.037 に答える
1

あなたの質問を正しく理解したかどうかわかりません:

フォームの構造は次のようになります。

  • フォームには、実行時に作成されたタイプ UserControl1 の多くの UserControls と 1 つの TextBox txtSimple を持つ Panel panel1 があります。
  • すべての UserControl には、["txtBox" + i] という名前の TextBox があります。
  • 選択時に、選択した UserControl の txtSimple と TextBox のテキストを同期したい

それで:

int i=0;
foreach (Control c in panel1.Controls)
{
    if (c is UserControl1) 
    {
        if (((UserControl)c).Selected)
        {
             TextBox dynTxtBox = (TextBox)c.Controls["txtBox" + i];
             txtSimple.Text= dynTxtBoxe.Text;
        }
    }
    i++;
}

この方法で TextBox が見つからない場合は、名前が正しく設定されていない可能性があります。

また、UserControl に TextBox が 1 つしかない場合は、通常、そのような特定の方法で名前を付ける必要はありません (つまり、コードから、最初のユーザー コントロールに txtBox0 があり、2 番目に txtBox1 があると仮定したということです)。「txtBox」という名前を付けて、次のようにアクセスできます。

txtSimple.Text = selectedUserControl.Controls["txtBox"].Text;

コントロール名は、Control、UserControl、および Form の Controls コレクション内で一意です。

于 2013-04-05T13:16:29.610 に答える
1
Control[] txt = ...
txtSimple.Text= txtBox[0].Text ;

txtBox[0].Text を txt[0].Text に置き換えてもよいですか?

于 2013-04-05T12:50:31.243 に答える
1

まず始めに

Control[] txt = Panel1.Controls.Find("txtBox" + i.ToString(), true)

それで

foreach (Control c in txt) // txt???
{
    UserControl1 uc = c as UserControl1;
    if (uc != null) 
    {
        if (uc.Selected) txtSimple.Text= uc.Text ;
    }
}

次に、UserControl1 をテストしている場合は、UserControl ではなく UserControl1 にもキャストする必要があります。

UserControl1 は非常に悪い名前です..

すべてのコントロールに txtBox で始まる名前が付けられ、他のコントロールには名前が付けられていないという仮定については言及しません...

そして、実行時に複数のコントロールが選択されていると、全体が死んでしまいます。

于 2013-04-05T12:53:58.617 に答える