C# 使控件动态识别另一个控件

C# 使控件动态识别另一个控件,c#,winforms,dynamic,C#,Winforms,Dynamic,我有一个应用程序窗口窗体,我在其中创建了动态控件,我需要像按键这样的程序事件,但我不能这样做,因为一旦它们在运行时存在,它们就彼此不认识了。(对不起:谷歌Tradutor的英文版)您可以尝试以下代码: public partial class Form1 : Form { // Create an instance of the button TextBox test = new TextBox(); public Form1() { Initi

我有一个应用程序窗口窗体,我在其中创建了动态控件,我需要像按键这样的程序事件,但我不能这样做,因为一旦它们在运行时存在,它们就彼此不认识了。(对不起:谷歌Tradutor的英文版)

您可以尝试以下代码:

public partial class Form1 : Form
{
    // Create an instance of the button
    TextBox test = new TextBox();

    public Form1()
    {
        InitializeComponent();
        // Set button values
        test.Text = "Button";

        // Add the event handler
        test.KeyPress += new KeyPressEventHandler(this.KeyPressEvent);

        // Add the textbox to the form
        this.Controls.Add(test);
    }


    // Keypress event
    private void KeyPressEvent(object sender, KeyPressEventArgs e)
    {
        MessageBox.Show(test.Text);
    }
}

这应该行得通

问题似乎是您正在本地创建动态变量:

ComboBox c1 = new Combobox(); 
TextBox t1 = new TextBox();
稍微改变一下jacqijvv的答案,使其看起来更像我相信您正在努力实现的目标。我还将假设您有多个相互关联的textbox/combobox对,因此您可以将它们存储在dictionary对象中,以便稍后在事件处理程序中检索它们:

public partial class Form1 : Form
{
    public Dictionary<TextBox, ComboBox> _relatedComboBoxes;
    public Dictionary<ComboBox, TextBox> _relatedTextBoxes;

    public Form1()
    {
        InitializeComponent();

        _relatedComboBoxes = new Dictionary<TextBox, ComboBox>();
        _relatedTextBoxes = new Dictionary<ComboBox, TextBox>();

        TextBox textBox = new TextBox();
        textBox.Text = "Button1";
        textBox.KeyDown += textBox_KeyDown;

        ComboBox comboBox = new ComboBox();
        // todo: initialize combobox....
        comboBox.SelectedIndexChanged += comboBox_SelectedIndexChanged;


        // add our pair of controls to the Dictionaries so that we can later
        // retrieve them together in the event handlers
        _relatedComboBoxes.Add(textBox, comboBox);
        _relatedTextBoxes.Add(comboBox, textBox);

        // add to window
        this.Controls.Add(comboBox);
        this.Controls.Add(textBox);

    }

    void comboBox_SelectedIndexChanged(object sender, EventArgs e)
    {
        ComboBox comboBox = sender as ComboBox;
        TextBox textBox = _relatedTextBoxes[comboBox];
        // todo: do work
    }

    void textBox_KeyDown(object sender, KeyEventArgs e)
    {
        TextBox textBox = sender as TextBox;
        // find the related combobox
        ComboBox comboBox = _relatedComboBoxes[textBox];

        // todo: do your work

    }
}
公共部分类表单1:表单
{
公共字典相关的组合框;
公共词典相关文本框;
公共表格1()
{
初始化组件();
_RelatedComboBox=新字典();
_RelatedTextBox=新字典();
TextBox TextBox=新建TextBox();
textBox.Text=“Button1”;
textBox.KeyDown+=textBox\u KeyDown;
ComboBox ComboBox=新建ComboBox();
//todo:初始化组合框。。。。
comboBox.SelectedIndexChanged+=comboBox\u SelectedIndexChanged;
//将我们的一对控件添加到字典中,以便以后可以
//在事件处理程序中一起检索它们
_添加(文本框,组合框);
_添加(组合框,文本框);
//添加到窗口
this.Controls.Add(组合框);
this.Controls.Add(文本框);
}
void组合框\u SelectedIndexChanged(对象发送方,事件参数e)
{
ComboBox ComboBox=发件人作为ComboBox;
文本框文本框=_relatedTextBox[comboBox];
//托多:干活儿
}
void textBox_KeyDown(对象发送器,KeyEventArgs e)
{
TextBox TextBox=发送者作为TextBox;
//找到相关的组合框
ComboBox ComboBox=_relatedComboBox[textBox];
//托多:做你的工作
}
}

您所说的相互识别是什么意思?控件是否需要相互了解,或者只是包含表单需要了解它们?还是你只是想把事情联系起来?请将您的代码显示在创建它们的位置。我认为他们确实需要相互了解,因为C1控件事件将在C2(第二个控件)中执行某些操作。请发布创建控件的代码和来自事件处理程序的代码。jacqijw,感谢您的帮助,但我做到了。我写错了事件。我想做的是:组合框c1=新组合框();TextBox t1=新的TextBox。根据c1.SelectedIndex,我尝试启用或不启用t1,但它不起作用,因为当我在按下t1键时,c1不在那里,好的,现在让我来看看这个?你想用一个带有按键事件的文本框来显示一个组合框吗?不。我有一个dinamic创建的组合框,当按下“回车”键时,它会落在combobox.KeyDown和if(combobox.SelectedItem.equals(“Date”))t1.MaxLenght=10,否则if(combobox.SelectedItem.equals(“Name”))t1.MaxLenght=50;但是进入组合框。键入t1不存在谢谢大家,也许我无法正确解释,但BradRem的反应正是我想要的。多谢各位