如何使用c#在MDI文本编辑器中创建查找/替换对话框?

时间:2013-10-24 19:36:07

标签: c#

我在查找对话框中使用以下代码(它本身就是一个单独的表单)。 它为While循环提供了Null参考。任何人都可以帮助解决这段代码的错误,或者它是在mdi编辑器中查找文本的正确方法吗?谢谢

// Form1 is the main form having all editors functionalities

    private void findbtn_Click(object sender, EventArgs e)
            {
                Form1 f1 = new Form1();


                int index = 0;

                while (index < f1.GetRichtextbox().Text.LastIndexOf(textBox1.Text))
                {
                    f1.GetRichtextbox().Find(textBox1.Text,index,f1.GetRichtextbox().TextLength,RichTextBoxFinds.None);
                    f1.GetRichtextbox().SelectionBackColor = Color.Yellow;
                    index = f1.GetRichtextbox().Text.IndexOf(f1.GetRichtextbox().Text, index) + 1;
                }


            }

1 个答案:

答案 0 :(得分:2)

  

Form1是具有所有编辑器功能的主要表单

正确...您需要在屏幕上向用户显示Form1的实际实例的引用。在创建它时将其引用传递到“查找”对话框,或者如果“查找”对话框也是MdiChild,请使用MdiParent()属性获取主MDI表单,然后遍历其MdiChildren()属性直到找到所需的Form1实例。

编辑:

O.k。,当您创建并显示“查找”表单时,可以在Show()命令中传递对MdiParent的引用:

public partial class frmMdiParent : Form
{

    public frmMdiParent()
    {
        InitializeComponent();
    }

    private void findToolStripMenuItem_Click(object sender, EventArgs e)
    {
        frmFind find = new frmFind();
        find.Show(this);
    }

}

现在,在“查找”表单中,您可以将Owner()属性强制转换回MdiParent。使用其ActiveMdiChild()属性获取对Form1的引用:

public partial class frmFind : Form
{

    private frmMdiParent frmMDI = null;

    public frmFind()
    {
        InitializeComponent();
        this.Shown += new EventHandler(frmFind_Shown);             
    }

    void frmFind_Shown(object sender, EventArgs e)
    {
        if (this.Owner != null && this.Owner is frmMdiParent)
        {
            this.frmMDI = (frmMdiParent)this.Owner;
        }
    }

    private void btnFind_Click(object sender, EventArgs e)
    {
        if (this.frmMDI != null && this.frmMDI.ActiveMdiChild is Form1)
        {
            Form1 frm1 = (Form1)this.frmMDI.ActiveMdiChild;
            // ... do something with "frm1" ...
            frm1.Text = "Hello from `frmFind`...";
        }
    }

}