【问题标题】:Pass parameter in an already opened form in C#在 C# 中已打开的表单中传递参数
【发布时间】:2023-03-26 14:05:02
【问题描述】:

我想向文本框传递一个参数。我有以下代码,它正在传递参数,但不是我想要的方式。 我的主表单已经打开,我想从我的搜索表单中传递参数。当我使用下面的代码时,它会打开 mt 1 更多主窗体,并且参数显示在其中。我希望能够在打开的主窗体中显示。

当我删除 frmMain.Show();什么都没有发生。

Main frmMain = new Main();
artikal = "TEST TEST";

frmMain.ed_artiakal.Text = artikal;
frmMain.Show();

有什么建议吗?

【问题讨论】:

  • 您需要在搜索表单中引用原始表单。您可以通过构造函数将其传递给搜索表单,也可以使用 Main-form 作为参数重载 Show/ShowDialog
  • 您需要对原始表单的引用或(更好)原始表单可以附加到的事件以获取数据 - 这样您就不会将两个表单耦合在一起。

标签: c#


【解决方案1】:

您有许多变体可以解决您的问题。

选项 1 定义和使用自定义事件。

搜索表单代码:

public event EventHandler ArtikalTextChanged;

private void textBox1_TextChanged(object sender, EventArgs e)
{
     if (ArtikalTextChanged != null)
         ArtikalTextChanged(this, EventArgs.Empty);
}

主窗体代码:

private void button1_Click(object sender, EventArgs e)
{
    Search search = new Search();
    search.ArtikalTextChanged += OnArtikalTextChanged;
    search.Show();
}

private void OnArtikalTextChanged(object sender, EventArgs e)
{         
    this.ed_artiakal.Text = (sender as Search).textBox1.Text;
}

不要忘记将搜索表单的 textBox1 设为公开。

选项 2 在搜索表单中获取主表单的实例:

搜索表单代码:

private void textBox1_TextChanged(object sender, EventArgs e)
{
    var mainForm = Application.OpenForms.OfType<Main>().FirstOrDefault();
    mainForm.ed_artiakal.Text = textBox1.Text;
}

主窗体代码:

private void button1_Click(object sender, EventArgs e)
{
    Search search = new Search();
    search.Show();
}

不要忘记在主窗体中公开 ed_artiakal 控件。

选项 3 在表单之间共享数据(推荐) 但是,如果您的应用程序很大并且您希望使其可扩展和灵活,我建议您使用数据绑定技术在表单之间共享数据而不耦合它们。您可以阅读更多文章:http://msdn.microsoft.com/en-us/library/h974h4y2(v=vs.90).aspx

【讨论】:

  • 您忘记了选项 4,“将 MainForm 实例传递给搜索表单”。也就是说,恕我直言,您的选项 1 确实是更好的主意;搜索表单应该是通用的,没有对MainForm 的具体引用。我要更改的一件事是公开整个textBox1 对象,而是将其Text 属性公开为搜索表单本身的属性。
【解决方案2】:

我通过以下方式解决了我的问题。

在我的搜索表单上,我创建了一个公共字符串,当我显示表单时,我在 GetItemCode 案例中引用了该字符串。

这里的关键是使用 ShowDialog() 而不是使用 Show()。

搜索表单

Search frmSearch = new Search();
frmSearch.ShowDialog();

ed_artiakal.Text = frmSearch.GetItemCode;

主窗体

public string GetItemCode
        {
            get { return Artikal; }
        }

现在,当我关闭搜索表单时,值会显示在主表单的 TextBox 中。

感谢您的回答和cmets!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多