【问题标题】:Change the Form Text from another Form从另一个表单更改表单文本
【发布时间】:2013-12-02 15:17:14
【问题描述】:

我有 2 个 Winforms(在 Visual C# 上)。在 Form1 上,我有一个按钮,当用户单击它时,我希望在打开 Form2 之前更改 Form2 的文本(出现在我的 Winform 左上角的文本)。

我尝试了这些 (1) (2) 但它们不起作用。

在 Form2 我有

public string formtext
{
   get {return this.Text;}
   set {this.Text = value;}
}

这是我在 Form1 上的按钮

public void kryptonButton2_Click(object sender, EventArgs e)
{             
    // Form2
    Form2 form2 = new Form2();
    form2.Text = "Η πόλη του Πειραιά";
 }

请注意,我单击该按钮更改文本,然后单击另一个按钮打开 Form2。

Form2 打开,但文本没有改变。

【问题讨论】:

标签: c# winforms forms


【解决方案1】:

您的 Form2 实例必须可以从您的文本更改例程中访问。

private Form2 m_form2;

public Form1() {
  InitializeComponent();
  m_form2 = null;
}

现在您已经打好了基础,您需要使用 Show()NOT ShowDialog() 调用您的 m_form2 对象:

private void ShowForm2(string optionalText) {
  if (m_form2 == null) {
    m_form2 = new Form2();
    m_form2.Show();
  } else {
    m_form2.Focus();
  }
  if (!String.IsNullOrEmpty(optionalText)) {
    m_form2.Text = optionalText;
  }
}

使用此设置,您的按钮应该适用于 Form2,方法是修改您的例程以执行以下操作:

public void kryptonButton2_Click(object sender, EventArgs e) {             
  ShowForm2(null);
  m_form2.Text = "Η πόλη του Πειραιά";
}

OR使用optionalText参数:

public void kryptonButton2_Click(object sender, EventArgs e) {             
  ShowForm2("Η πόλη του Πειραιά");
}

您也可以使用委托来执行此操作。这是 C# 的一个非常强大的特性。如果您想查看其中的代码示例,请在此处查看我对这个问题的回答:

https://stackoverflow.com/a/19146929/153923

更新

听起来您可能只需要 Mike Cheel 答案的更新版本。

试试:

public void kryptonButton2_Click(object sender, EventArgs e) {             
    Form2 form2 = new Form2();
    form2.formtext = "Η πόλη του Πειραιά";
    form2.Show(); // Mike left this part out
 }

【讨论】:

  • @Shevliaskovic - 我已更新此答案以显示如何使用可选文本参数进行设置。
  • 只有使用与更改文本相同的按钮打开新表单才能实现此目的?
  • 我正在阅读您在 Servy 的答案中所做的 cmets,并编辑了我的答案以反映您想要完成的内容。如果这就是您想做的全部,请尝试对 Mike Cheel 的答案进行稍微编辑的版本。我将在大约 30 秒内将其添加为我的答案的更新......
【解决方案2】:

试试:

public void kryptonButton2_Click(object sender, EventArgs e)
{             
    // Form2
    Form2 form2 = new Form2();
    form2.formtext = "Η πόλη του Πειραιά";
 }

【讨论】:

  • 还是没变
【解决方案3】:

您的方法不起作用有几个原因。

public void kryptonButton2_Click(object sender, EventArgs e)
{             
 Form2 form2 = new Form2(); //<-- this is a new instance for Form2
 form2.Text = "Η πόλη του Πειραιά"; //<-- and this is not your propery 
                                    //(as pointed out by @MikeCheel)
}

如果您没有 Form2 的实例,那么您可以尝试从 Application.OpenForms 获取它,但这是一个 HACK。

var frm2 = Application.OpenForms.Cast<Form>()
                      .FirstOrDefault(c => c.Name == "Form2"); 
if(frm2 != null)
 form2.formtext= "Η πόλη του Πειραιά"; 

【讨论】:

  • 你是什么意思'黑客'?还是没变
  • HACK 是一个糟糕的解决方案 - 但是,一个有效的解决方案。我的工作正常。确保您的Form2 将其Nameproperty 设置为"Form2"(这就是为什么它是一个hack :))
【解决方案4】:

当您单击另一个按钮打开表单时,您需要保留对它的引用,以便您的其他按钮单击事件可以使用它:

private Form2 child;
public void openOtherForm_Click(object sender, EventArgs e)
{             
    child = new Form2();
    child.Show();
}

现在您可以使用该字段来操作它:

public void kryptonButton2_Click(object sender, EventArgs e)
{             
    form2.formtext = "Η πόλη του Πειραιά";
}

【讨论】:

  • 所以首先我必须打开 Form2,然后按下 Form1 上的按钮?
  • @Shevliaskovic 这就是 youyou 想要发生的事情。如果您希望发生其他事情,您需要描述它应该是什么。
  • 也许我不清楚。我希望在我打开它之前改变它。我会把这个添加到我的帖子中
  • @Shevliaskovic 如果您还没有创建它,那么它就不存在。只需将字符串存储为实例字段,这样您就可以在 创建表单时设置文本。
  • 不,我已经创建了它。当我运行我的程序时,Form1 出现了。用户单击此表单上更改 Form2 文本的按钮,然后单击另一个按钮并打开 Form2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
  • 2012-04-20
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多