【问题标题】:Forms Communication形式沟通
【发布时间】:2013-06-10 04:17:28
【问题描述】:

我有 2 个表格,其中包括:

Form1:

2个按钮命名: btn复制和 btn粘贴 (内部有 rtb.Copy(); 和 rtb.Paste(); 等函数,应该适用于 Form2 中的 Richtextbox)

Form2:

1richtextbox 命名为:rtb

我的问题是: 如何在 Form1 的 2buttons(及其功能)和 Form2 中的 Richtextbox 之间进行通信。

like:当我在 Form2 中的 Richtextbox(rtb) 中键入文本时,我选择所有文本,然后我从 Form1 中按下 CopyButton(btnCopy),文本应该被复制,与我从 Form1 中按下 PasteButton(btnPaste) 时相同,文本具有被复制的应该是粘贴在可以在 Form2 上找到的 RichTextBox(rtb) 中。

我该怎么做?

【问题讨论】:

  • 任何理由,你为什么需要 2 个表单,你可以在同一个表单中拥有richtextbox..如果你仍然需要使用 2 个表单,是模态的第二个吗?
  • form1 用作容器,我正在做 IDE btw ... @jacobaloysious
  • Form1 会先调用 Form2 吗?或其他方式?或其他一些表单调用 Form1 和 Form2(我对此表示怀疑)?
  • @Edper,可以在 Form1 中有另一个名为 btnNew 的按钮,然后 Form2 将被调用,然后方法将继续......
  • @Elegiac 你的意思是 Form1 是 MDI 父级,而 Form2 在 MDI 内?

标签: c# winforms communication


【解决方案1】:

假设您有 Form1ToolStrip Button 名称 PasteToolStripButton 喜欢:

  public partial class Form1 : Form
{
    Form2 formChild;

    public Form1()
    {
        InitializeComponent();
        this.Load += new EventHandler(Form1_Load);
    }

    void Form1_Load(object sender, EventArgs e)
    {
       formChild = new Form2();
       formChild.MdiParent = this;
       formChild.Show();            
    }


   private void CopyToolStripButton_Click(object sender, EventArgs e)
    {
        formChild.CopyText(); // Method to copy Rich Text Box in Form2
    }

    private void PasteToolStripButton_Click(object sender, EventArgs e)
    {
        formChild.PasteText(); // Method in Form2 to Paste to the RichTextBox in Form2
    }

}

在您的Form2 中,您需要添加一个名为PasteTextCopyTextPublic 方法,例如:

  public void PasteText()
  {
     rtbChild.Text = Clipboard.GetText(); // this one simulates the rtb.Paste()
  }

  public void CopyText()
  {
     rtb.Copy(); 
  }

我还将Form2 中的RichTextBox 命名为rtbChild,因此每次单击例如粘贴都会复制到RichTextBox 中的Form2

【讨论】:

  • 先生,这里的 rtb.Copy 代码和 rtb.Paste 执行在哪里?
  • form1 中的错误名称 'rtb' 在当前上下文中没有退出 ... rtb 必须在 form2 中先生 ... @Edper
  • 将 rtb 更改为您的 RichTextBox 的名称,假设名称是 RichTextBox1,那么它应该是 RichTextBox1。
  • rtb 必须在 form2 中先生 ... 2 个按钮仅在 form1 和 form2 上带有丰富的文本框
  • 我也尝试推荐“rtb.Copy();”但出现另一个错误,指向 Form1_Load 中的内容:指定为此表单的 MdiParent 的表单不是 MdiCONtainer。
【解决方案2】:

在 Form1 上创建一个公共属性,然后从 Form2 设置它。 编辑: 在表格 1 上: 公共字符串 TextForRTB {get;设置;}

在 Form2 上: Form1 a = new Form1(); a.TextForRtb = rtb.Text;

【讨论】:

    【解决方案3】:

    Sol1:将其中一种形式传递给另一种形式,如构造函数中的Form1(Form parent){....},那么您应该会看到它的公共属性和方法。

    Sol2:创建自定义事件以在富文本框上的文本发生更改时引发它,因此使用此富文本框初始化表单的表单将执行某些操作,例如启用/禁用按钮或其他操作

    ...实际上,这种行为有很多解决方案,我想知道为什么您需要将文本框与在业务逻辑中似乎密切相关的按钮放在不同的形式!

    【讨论】:

      【解决方案4】:

      您可以在Form2 中公开两种方法GetRichTextBoxContentSetRichTextBoxContent。 这将更新Form2richTextBox 的内容。

      然后你可以处理InstanceForm2 表单Form1

      注意:这里的主要想法是如何获得Form2Instance。获取该实例取决于您的实现。

      public class Form2 : Form
      {
          public string GetRichTextBoxContent()
          {
              return this.richTextBox1.Text;
          }
      
          public void SetRichTextBoxContent(string content)
          {
              this.richTextBox1.Text = content;
          } 
      }
      
      public class Form1 : Form
      {
          //Based on your implementation 
          Form2 form2 = new Form2();
      
          private void Button_CopyClick(object sender, EventArgs e)
          {
              var contentFromRtb = form2.GetRichTextBoxContent();
          } 
          private void Button_PasteClick(object sender, EventArgs e)
          {
              var someContent = "Content to be copied to text box"
              form2.SetRichTextBoxContent(someContent );
          } 
      }
      

      【讨论】:

      • 先生,这里的 rtb.Copy 代码和 rtb.Paste 执行在哪里?
      • 顺便说一句,你不需要copyPaste 因为this.richTextBox1.Text 会为你获取和设置内容..
      • 它不起作用先生...每次我从 rtb 中选择文本然后按 form1 中的 button_copy 和 button_paste 然后我在 rtb 中选择没有变化先生...它始终专注于按钮。应该我愿意吗?
      猜你喜欢
      • 2021-05-08
      • 2018-05-12
      • 1970-01-01
      • 2011-07-14
      • 2016-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-25
      相关资源
      最近更新 更多