【问题标题】:How to modify a RichTextBox of other Form in C#.NET如何在 C#.NET 中修改其他 Form 的 RichTextBox
【发布时间】:2010-02-13 16:13:28
【问题描述】:

我正在构建一个记事本。我有一个查找和替换表格。当我单击表单打开的按钮时,用户在两个文本框中输入两个输入并按下一个按钮。然后应该修改主窗体中的 RichTextBoxes。

这是FindAndReplace 的形式:

private void btnReplaceAll_Click(object sender, EventArgs e)
        {
            string findMe = txtFind.Text;
            string replaceMe = txtReplace.Text;
            Form1 f1 = new Form1();
            f1.MainText.Replace(findMe, replaceMe);
            //this.Hide();
        }

问题是它不起作用..我在f1.MainText.Replace(findMe, replaceMe); 行中收到 NullReferenceException 有什么想法吗?

【问题讨论】:

    标签: c# .net parameter-passing


    【解决方案1】:

    在这里你创建一个新的表单实例:

    Form1 f1 = new Form1();
    

    所有属性都被初始化为其默认值(即字符串为空)。接下来,您尝试在MainText 属性上调用Replace 方法,即null,您会得到异常:

    f1.MainText.Replace(findMe, replaceMe);
    

    你需要先初始化这个属性:

    f1.MainText = "blablabla";
    f1.MainText = f1.MainText.Replace(findMe, replaceMe);
    

    更新:

    当您创建 FindAndReplace 表单时,您可以将文本的当前值传递给它的构造函数:

    public class Form1 : Form
    {
        protected void FindAndReplace_Click(object sender, EventArgs e) 
        {
            var findAndReplaceForm = new FindAndReplaceForm(MainText.Text);
            findAndReplaceForm.ShowDialog();
            MainText.Text = findAndReplaceForm.NewText;
        }
    }
    
    public class FindAndReplaceForm : Form
    {
        private readonly string _originalText;
    
        public FindAndReplaceForm(string originalText)
        {
            _originalText = originalText;
        }
    
        public string NewText 
        { 
            get 
            {
                return (_originalText ?? string.Empty).Replace(findMe, replaceMe);
            }
        }
    }
    

    【讨论】:

    • 还应该注意,调用f1.MainText.Replace 不会做任何事情。 Replace 返回一个带有请求替换的新字符串;它不执行就地修改(字符串是不可变的)。
    • 我需要用 MainText.. 的当前值初始化 f1.. 有什么办法吗?
    • @Bibhas,current 值是什么意思?它存储在哪里?
    • 查看场景。我在 form1 的 MainText(RichTextBox) 上写了一些东西。然后按一个按钮打开有两个文本框的 FindNReplace 表单。我按下后面表格上的替换按钮。 MainText shud 的值被改变..
    【解决方案2】:

    您的查找和替换表单必须了解您的主表单。您这样做的方式是创建一个全新的主窗体,主文本区域中没有文本。创建查找和替换表单时,您应该将父表单,甚至只是正文传递给查找和替换表单,然后从刚刚传入的表单中搜索主表单文本。

    你想要类似下面的东西:

    public class FindAndReplaceForm
    {
        private Form1 MainForm;
    
        public FindAndReplaceForm(Form1 parentForm)
        {
            this.MainForm = parentForm;
            //The rest of you constructor here
        }
    
        private void btnReplaceAll_Click(object sender, EventArgs e)
        {
            string findMe = txtFind.Text;
            string replaceMe = txtReplace.Text;
    
            //The following line will search the parent form
            this.MainForm.MainText.Replace(findMe, replaceMe);
            //this.Hide();
        }
    }
    

    【讨论】:

    • 层次结构可能会因多个表单而变得非常麻烦。
    • this.ParentForm = parentForm; 此行无效。 this.parentform 获取父窗体的一个实例..
    • @Bibhas,你错了。它是一个实例变量,对获取或设置没有任何限制。
    • 我在tooltip和msdn中看到了:ContainerControl.ParentForm属性:获取容器控件分配给的表单。
    • 我忘记为Forms定义了父表单,您只需更改实例变量的名称即可。现在更新代码。如果你给我们创建了应用程序MDI,那么你使用ParentForm来告诉表单它属于哪个窗口
    【解决方案3】:

    您可以将静态表单引用添加到您的 Program 类。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        static class Program
        {
            public static Form1 F1 { get; set; }
            public static Form2 F2 { get; set; }
    
            /// <summary>
            /// The main entry point for the application.
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
    
                Form1 = new Form1();
                Form2 = new Form2();
    
                Application.Run(Form1);
            }
        }
    }
    

    然后,您可以在应用程序的任何表单中使用Program.Form1Program.Form2 作为已实例化的引用。

    【讨论】:

    • 如果需要使用Form1来访问,为什么还需要F1F2??
    • 这并不能真正回答问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-17
    • 2020-02-24
    • 2019-01-07
    • 2022-12-04
    相关资源
    最近更新 更多