【问题标题】:How to update contents of rich text box in form1 with values coming from form2 without closing form2?如何使用来自form2的值更新form1中富文本框的内容而不关闭form2?
【发布时间】:2013-09-18 08:49:45
【问题描述】:

我想在两个表单之间传递值(c# 都处于活动状态)。我该怎么做?

我有两种表格:Form1 和 Form2。

Form1 包含一个富文本框和一个按钮。当我单击该按钮时,Form2 应该打开,富文本框中的文本应该发送到 Form2 中的文本框,Form1 应该保持打开状态,并且在 Form2 的背面。

Form2 包含一个文本框和一个按钮,用户在其中编辑文本框中的文本,当用户单击按钮时,编辑后的文本应发送回 Form1 中的富文本框,Form2 应关闭/保持打开状态,Form1应该在富文本框中突出显示更新的文本。

我该怎么做?有人可以用一个简单的例子帮我做这件事吗?

【问题讨论】:

  • 向我们展示您到目前为止的尝试。
  • 我还没有尝试过,因为我不知道该怎么做。我只是想实现这个目标,因为我是 C# 新手!请帮帮我!
  • 另外你为什么要问已经问过的同一个问题。您问题的确切字词副本是HERE
  • 是的,我解决了这个问题,但这不是我想要的,也不是前面提到的问题满足我的要求。顺便说一句,如果您有解决方案,请不要花时间获取匹配项,而是提供答案。

标签: c# .net winforms richtextbox message-passing


【解决方案1】:

请根据需要更改字段名称。当 form2 中的文本字段值更改时,以下代码还将同时更新富文本框的值。您可能需要做一些小的更改以在按钮更改事件上触发它。

将以下方法添加到您的From1

private void SetChildFromValueToParent(object obj, EventArgs args)
    {
        //Read the child form's control value and set it to parent form field
        txtBox.Text = ((TextBox)(obj)).Value.ToString();
    }

将以下逻辑添加到您的Form1 按钮单击,这将打开Form2

private void button1_Click(object sender, EventArgs e)
{
    ChildForm childForm = new ChildForm();

    //Find the textbox control in the child form
    Control[] controls = childForm.Controls.Find("textBox", true);

    if (null != controls[0])
    {
        //Bind the method in the parent form to child form text control's TextChanged event
        controls[0].TextChanged += new System.EventHandler(SetChildFromValueToParent);
    }

    childForm.ShowDialog();
}

编辑 - 获得按钮点击的价值

   private void SetChildFromValueToParent(object obj, EventArgs args)
        {
             //Read the child form's control value and set it to parent form field
             Form2 from2 = new Form2();
             string richTextBox.Text =  ((TextBox)form2.Controls["textBox1"]).Text;            
        }

【讨论】:

  • 感谢访问未被拒绝但被授予!做完我会告诉你的!谢谢!
  • 谢谢我做到了,工作正常,但我想用按钮控制触发这个事件。按钮控件的过程与我的感觉相同,如果我使用按钮控件触发此事件,那么它看起来像这样: Control[] controls = childForm.Controls.Find("button1", true); controls[0].onClick += new System.EventHandler(SetChildFromValueToParent);对吗?
【解决方案2】:

在某些方面我更喜欢第一个答案,但这里有一种方法可以帮助您理解这两种形式之间的关系。注意:要使其正常工作,两个富文本框都需要从私有更改为内部:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void btnEditOnForm1_Click(object sender, EventArgs e)
    {
        var form2 = new Form2(richTextBoxOnForm1);
        form2.richTextBoxOnForm2.Text = richTextBoxOnForm1.Text;
        form2.ShowDialog(this);
    }
}

public partial class Form2 : Form
{
    private readonly RichTextBox _rtb;

    public Form2(RichTextBox pRTB)
    {
        InitializeComponent();
        _rtb = pRTB;
    }

    private void btnOkOnForm2_Click(object sender, EventArgs e)
    {
        _rtb.Text = richTextBoxOnForm2.Text;
        this.Close();
    }

    private void btnCancelOnForm2_Click(object sender, EventArgs e)
    {
        this.Close();
    }
}

请注意 Form2 需要引用回 Form1 上的 Richtextbox 以更新它,因此您需要调整构造函数以接受该引用。

或者,您可以在 Form1 中创建一个合适的函数来更新那里的富文本框,并使用它调用它

    private void btnOkOnForm2_Click(object sender, EventArgs e)
    {
        ((Form1)this.Owner).UpdateRichTextBoxOnForm1(richTextBoxOnForm2.Text);
        this.Close();
    }

利用您在 ShowDialog 调用中包含发送者('this')这一事实

        form2.ShowDialog(this);

【讨论】:

  • 谢谢先生!有效!但是你能告诉我,如果我们看看下面“AccessDenied”给出的第二个答案,你能告诉我,如果我想用按钮控制触发这个事件。按钮控件的过程与我的感觉相同,如果我使用按钮控件触发此事件,那么它看起来像这样: Control[] controls = childForm.Controls.Find("button1", true); controls[0].onClick += new System.EventHandler(SetChildFromValueToParent);对吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多