Winform 子窗体访问父窗体控件

时间:2022-09-11 14:05:43
我想实现一个类似记事本中查找替换文本的功能,
查找窗体怎么让匹配到的内容在父窗体中的richTextBox中选中?
希望各位路过的大侠支招,谢谢!

14 个解决方案

#1


在父窗体中创建一个自身的公共静态变量
class MainForm
{
public static MainForm mainForm=null;
MainForm()
{
mainForm=this;
}
}
class childForm
{

pbulci void SelectText()
{
MainForm.mainForm.richTextBox.SelectedStart=100;
}
}

#2


winform间传值
public partial class Form1 : Form 
    { 
        private void button1_Click(object sender, EventArgs e) 
        { 
            Form2 frm2 = new Form2(); 
            frm2.Show(this); 
        } 
    } 

    public partial class Form2 : Form 
    { 
        private void button1_Click(object sender, EventArgs e) 
        { 
            Form1 frm1 = (Form1)this.Owner; 
            ((TextBox)frm1.Controls["textBox1"]).Text = this.textBox2.Text; 
            this.Close(); 
        } 
    } 
还可使用委托


#3


引用 2 楼 wuyq11 的回复:
winform间传值
public partial class Form1 : Form
    {
        private void button1_Click(object sender, EventArgs e)
        {
            Form2 frm2 = new Form2();
            frm2.Show(this);
        }
    }

    public partial class Form2 : Form
    {
        private void button1_Click(object sender, EventArgs e)
        {
            Form1 frm1 = (Form1)this.Owner;
            ((TextBox)frm1.Controls["textBox1"]).Text = this.textBox2.Text;
            this.Close();
        }
    }
还可使用委托

正解

#4


通过委托实现复杂的窗体通信,比如可以传递复杂的数据类型,同时,可以在设计结构更加良好的中间通信类
public partial class MainFrm: Form
{
 private void MainFrm _Load(object sender, EventArgs e)
 {
  Middle.sendEvent += new Middle.SendMessage(this.DoMethod);
 }
 public void DoMethod(string getstr)
 {
  listBox1.Items.Add(getstr);
 }
}

ChildFrm.cs:

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

 private void button1_Click(object sender, EventArgs e)
 {
  Middle.DoSendMessage(this.textBox1.Text);
  textBox1.Text = "";
  textBox1.Focus();
 }
}

Middle.cs:

public static class Middle
{
 public delegate void SendMessage(string str);
 public static event SendMessage sendEvent;
 public static void DoSendMessage(string str)
 {
  sendEvent(str);
 }
}

static class Program
{
 [STAThread]
 static void Main()
 {
  Application.EnableVisualStyles();
  Application.SetCompatibleTextRenderingDefault(false);
  Form1 mainFrm = new Form1();
  childFrm secondFrm = new childFrm();
  secondFrm.Show();
  Application.Run(mainFrm);
 }
}

#5


private   void   button1_Click(object   sender,   EventArgs   e) 
                { 
                        int   i   =   richTextBox1.Find(""); 
                        while   (i   > =   0) 
                        { 
                                richTextBox1.SelectedText= ""; 
                                i=richTextBox1.Find(""); 
                        } 
                        richTextBox1.Focus(); 
                } 

#6


设置公共变量最简单,弹出窗口时给变量赋值,窗口关闭时进行查找替换操作。

#7


WinForm传值问题,简单的很

#8


呵呵 自己测试没有问题
// Form1  内代码被查找窗体
 
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.label1.Text = "快来查找我";
            this.label2.Text = ""; 
        }
        
        Form2 f2 = new Form2();
        private void button1_Click(object sender, EventArgs e)
        {
            f2.MyPing += new Form2.PING(f2_MyPing);
            f2.Show();//显示form2
        }

        void f2_MyPing(string str)//form2 点击确定后的方法
        {
            this.richTextBox1.Refresh();
            this.richTextBox1.SelectionFont = new Font("宋体", 9, FontStyle.Regular);//设置字体
            this.richTextBox1.SelectionBackColor = Color.Blue;//设置选中后的颜色
            this.label2.Text = str;//form2 选中后的参数
            int na = this.richTextBox1.Text.IndexOf(str);
            this.richTextBox1.Select(na, str.Length);//改变richTextBox值中查找的字体颜色
            MessageBox.Show(na.ToString());
            richTextBox1.SelectionBackColor = Color.Blue;//设置选中后的颜色

        }
    }

//form 2代码  查找窗体
public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        
        public delegate void PING(string str);
        public event PING MyPing;
        private void button1_Click(object sender, EventArgs e)
        {
            this.MyPing(this.textBox1.Text);
        }
    }

#9


引用 2 楼 wuyq11 的回复:
winform间传值
public partial class Form1 : Form
    {
        private void button1_Click(object sender, EventArgs e)
        {
            Form2 frm2 = new Form2();
            frm2.Show(this);
        }
    }

    public partial class Form2 : Form
    {
        private void button1_Click(object sender, EventArgs e)
        {
            Form1 frm1 = (Form1)this.Owner;
            ((TextBox)frm1.Controls["textBox1"]).Text = this.textBox2.Text;
            this.Close();
        }
    }
还可使用委托


呵呵…… 经典……

#10


再加一句:
父传子  借“构造”
子传父  用“属性”

至少,我经常这样弄…

#11


支持2楼的,其实原理很简单,无非是把父级对象传给子级,然后在子级调用父级的更新方法。不过要注意在调用的时候要防止用户关闭父级,不然会报错。。。

#12


上面都貼出OK的代碼了,我就順便頂一下吧。

#13


ok

#14


java3344520的方法很有用,受启发!

#1


在父窗体中创建一个自身的公共静态变量
class MainForm
{
public static MainForm mainForm=null;
MainForm()
{
mainForm=this;
}
}
class childForm
{

pbulci void SelectText()
{
MainForm.mainForm.richTextBox.SelectedStart=100;
}
}

#2


winform间传值
public partial class Form1 : Form 
    { 
        private void button1_Click(object sender, EventArgs e) 
        { 
            Form2 frm2 = new Form2(); 
            frm2.Show(this); 
        } 
    } 

    public partial class Form2 : Form 
    { 
        private void button1_Click(object sender, EventArgs e) 
        { 
            Form1 frm1 = (Form1)this.Owner; 
            ((TextBox)frm1.Controls["textBox1"]).Text = this.textBox2.Text; 
            this.Close(); 
        } 
    } 
还可使用委托


#3


引用 2 楼 wuyq11 的回复:
winform间传值
public partial class Form1 : Form
    {
        private void button1_Click(object sender, EventArgs e)
        {
            Form2 frm2 = new Form2();
            frm2.Show(this);
        }
    }

    public partial class Form2 : Form
    {
        private void button1_Click(object sender, EventArgs e)
        {
            Form1 frm1 = (Form1)this.Owner;
            ((TextBox)frm1.Controls["textBox1"]).Text = this.textBox2.Text;
            this.Close();
        }
    }
还可使用委托

正解

#4


通过委托实现复杂的窗体通信,比如可以传递复杂的数据类型,同时,可以在设计结构更加良好的中间通信类
public partial class MainFrm: Form
{
 private void MainFrm _Load(object sender, EventArgs e)
 {
  Middle.sendEvent += new Middle.SendMessage(this.DoMethod);
 }
 public void DoMethod(string getstr)
 {
  listBox1.Items.Add(getstr);
 }
}

ChildFrm.cs:

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

 private void button1_Click(object sender, EventArgs e)
 {
  Middle.DoSendMessage(this.textBox1.Text);
  textBox1.Text = "";
  textBox1.Focus();
 }
}

Middle.cs:

public static class Middle
{
 public delegate void SendMessage(string str);
 public static event SendMessage sendEvent;
 public static void DoSendMessage(string str)
 {
  sendEvent(str);
 }
}

static class Program
{
 [STAThread]
 static void Main()
 {
  Application.EnableVisualStyles();
  Application.SetCompatibleTextRenderingDefault(false);
  Form1 mainFrm = new Form1();
  childFrm secondFrm = new childFrm();
  secondFrm.Show();
  Application.Run(mainFrm);
 }
}

#5


private   void   button1_Click(object   sender,   EventArgs   e) 
                { 
                        int   i   =   richTextBox1.Find(""); 
                        while   (i   > =   0) 
                        { 
                                richTextBox1.SelectedText= ""; 
                                i=richTextBox1.Find(""); 
                        } 
                        richTextBox1.Focus(); 
                } 

#6


设置公共变量最简单,弹出窗口时给变量赋值,窗口关闭时进行查找替换操作。

#7


WinForm传值问题,简单的很

#8


呵呵 自己测试没有问题
// Form1  内代码被查找窗体
 
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.label1.Text = "快来查找我";
            this.label2.Text = ""; 
        }
        
        Form2 f2 = new Form2();
        private void button1_Click(object sender, EventArgs e)
        {
            f2.MyPing += new Form2.PING(f2_MyPing);
            f2.Show();//显示form2
        }

        void f2_MyPing(string str)//form2 点击确定后的方法
        {
            this.richTextBox1.Refresh();
            this.richTextBox1.SelectionFont = new Font("宋体", 9, FontStyle.Regular);//设置字体
            this.richTextBox1.SelectionBackColor = Color.Blue;//设置选中后的颜色
            this.label2.Text = str;//form2 选中后的参数
            int na = this.richTextBox1.Text.IndexOf(str);
            this.richTextBox1.Select(na, str.Length);//改变richTextBox值中查找的字体颜色
            MessageBox.Show(na.ToString());
            richTextBox1.SelectionBackColor = Color.Blue;//设置选中后的颜色

        }
    }

//form 2代码  查找窗体
public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        
        public delegate void PING(string str);
        public event PING MyPing;
        private void button1_Click(object sender, EventArgs e)
        {
            this.MyPing(this.textBox1.Text);
        }
    }

#9


引用 2 楼 wuyq11 的回复:
winform间传值
public partial class Form1 : Form
    {
        private void button1_Click(object sender, EventArgs e)
        {
            Form2 frm2 = new Form2();
            frm2.Show(this);
        }
    }

    public partial class Form2 : Form
    {
        private void button1_Click(object sender, EventArgs e)
        {
            Form1 frm1 = (Form1)this.Owner;
            ((TextBox)frm1.Controls["textBox1"]).Text = this.textBox2.Text;
            this.Close();
        }
    }
还可使用委托


呵呵…… 经典……

#10


再加一句:
父传子  借“构造”
子传父  用“属性”

至少,我经常这样弄…

#11


支持2楼的,其实原理很简单,无非是把父级对象传给子级,然后在子级调用父级的更新方法。不过要注意在调用的时候要防止用户关闭父级,不然会报错。。。

#12


上面都貼出OK的代碼了,我就順便頂一下吧。

#13


ok

#14


java3344520的方法很有用,受启发!