在线等,问一个简单问题:线程函数中如何访问父窗口的控件?

jxtvaudioer 2020-08-22 03:22:53

看来网上很多资料,好像都讲的比较麻烦,有简单一点的思路和例子吗?
...全文
5617 点赞 收藏 8
写回复
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
晨易夕 2020-08-24
凡是后台子线程要使用UI线程成员的,都应该是Invoke UI线程去执行委托。
回复
ziqi0716 2020-08-24
委托加Invoke正解
回复
qq_45841743 2020-08-24
将父窗体的引用传递给子窗体不就行了,比如构造函数、属性。也可以放到一个全局静态变量里,不就到处可以访问了。如果设置了Owner,也可以通过Owner反溯啊。当然也可以通过Windows API去FindWindow啊,方法很多了。
回复
飞天凤凰601 2020-08-24
主窗体调用子窗体

           public int setint=0;
            FormSon set = new FormSon();
            set.Owner = this;
            set.ShowDialog();
子窗体访问父窗体

  MainForm f1 = (MainForm)Owner;
f1.setint=1;
回复
threenewbee 2020-08-22
this.Owner.Invoke(new delegate() { this.Owner.xxx = xxx; });
回复
韩老骥 2020-08-22
将父窗体的引用传递给子窗体不就行了,比如构造函数、属性。也可以放到一个全局静态变量里,不就到处可以访问了。如果设置了Owner,也可以通过Owner反溯啊。当然也可以通过Windows API去FindWindow啊,方法很多了。
回复
glen30 2020-08-22
用Invoke,如下所示,richTextBox1是父窗口的控件,下面的函数可以在子线程里面使用(走if分支),也可以在父窗体代码里面使用(走else分支)
void setInfoText(string text)
{
string str = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " " + text + "\n";

if (richTextBox1.InvokeRequired)
{
richTextBox1.Invoke(new MethodInvoker(delegate
{
richTextBox1.AppendText(str);//在这里操作父窗体的控件
richTextBox1.HideSelection = false;
}));
}
else
{
richTextBox1.AppendText(str);
richTextBox1.HideSelection = false;
}
}
回复
派大奇 2020-08-22

// form1 有两个控件 
//1 textBox1文本控件
//2 backgroundWorker1 后台控件 模拟线程 
//3 button1 控件
public partial class Form1: Form {

        private void button1_Click(object sender, EventArgs e) {
            this.backgroundWorker1.RunWorkerAsync();
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {
            SetMessage("aaaa");
        }

            public void SetMessage(string str) {
            try {
                textBox1.Invoke(new Action(() => {
                    textBox1.Text= str;
                }));

            }
            catch {

            }
        }
}
回复
相关推荐
发帖
C#
创建于2007-09-28

10.6w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2020-08-22 03:22
社区公告

让您成为最强悍的C#开发者