C# 处理动态创建的控件?

C# 处理动态创建的控件?,c#,C#,我正在用c#编写简单的web浏览器。对于多选项卡功能,我添加了tabcontrol并将webbrowser1放在其中。我使用toolstripbutton动态添加选项卡页、WebBrowser(并使用webbrowser1事件处理其事件): 我的问题是我不能正确处理它们,因为我为webbrowser1编写了代码,不知道如何调用动态创建的对象。我写道: private void toolStripTextBox1_KeyDown(object sender, KeyEventArgs e)

我正在用c#编写简单的web浏览器。对于多选项卡功能,我添加了tabcontrol并将webbrowser1放在其中。我使用toolstripbutton动态添加选项卡页、WebBrowser(并使用webbrowser1事件处理其事件):

我的问题是我不能正确处理它们,因为我为webbrowser1编写了代码,不知道如何调用动态创建的对象。我写道:

    private void toolStripTextBox1_KeyDown(object sender, KeyEventArgs e)
    {
        foreach (Control c in tabControl1.SelectedTab.Controls)
        {
            if (e.GetType() == typeof(WebBrowser))
            {
                WebBrowser web = new WebBrowser();
                if (e.KeyCode == Keys.Enter)
                    web.Navigate(toolStripTextBox1.Text);
            }
        }

    }
但它根本不起作用(即使对于webbrowser1)。我该如何解决这个问题


提前谢谢

我想你打算这样做:

private void toolStripTextBox1_KeyDown(object sender, KeyEventArgs e)
{
    foreach (Control c in tabControl1.SelectedTab.Controls)
    {
        var web = c as WebBrowser;
        if (c != null && e.KeyCode == Keys.Enter)
        {
            web.Navigate(toolStripTextBox1.Text);
        }
    }
}
如果要在
选项卡Control
中的控件之间循环,则需要找到一个
WebBrowser
。拥有该控件后,您希望使用
WebBrowser
的特定实例执行导航,而不是创建新浏览器。我不知道密钥处理程序还有什么其他代码,但如果您只在enter上执行操作,我会修改此代码以首先检查该代码,并在实际需要时遍历集合。像这样:

private void toolStripTextBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode != Keys.Enter) return;

    foreach (Control c in tabControl1.SelectedTab.Controls)
    {
        var web = c as WebBrowser;
        if (c != null)
        {
            web.Navigate(toolStripTextBox1.Text);
        }
    }
}

e永远不等于类型WebBrowser它是一个事件,如果是,那么也可以创建WebBrowser的新实例,而不是创建事件处理程序给定类型的实例。也许您的意思是执行
sender.GetType()
if(发送者是WebBrowser)
会更好。您还在事件处理程序中创建一个新的
WebBrowser
对象,然后在新的
WebBrowser
中显示页面,而不是使用您已经在选项卡中加载的页面,这样您导航到的页面就永远不会显示给用户。您还为每一次击键创建了
WebBrowser
,并将其中大部分放在地板上,以便稍后清理。@TimonPost我使用了大约相同的代码在groupbox中找到选中的单选按钮并对其进行了修改(我认为它会起作用)。我没有任何其他想法。@StevenRogers您可能有一个外观相同的代码,但您永远无法从事件参数中获取控件实例
private void toolStripTextBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode != Keys.Enter) return;

    foreach (Control c in tabControl1.SelectedTab.Controls)
    {
        var web = c as WebBrowser;
        if (c != null)
        {
            web.Navigate(toolStripTextBox1.Text);
        }
    }
}