当前位置:编程学习 > C#/ASP.NET >>

在WinForms程序里实现窗体传值的最佳实践

--------------------编程问答-------------------- 初步看了下是不是就是实例化传值?! --------------------编程问答-------------------- 好东西,顶起来 --------------------编程问答-------------------- 好的 看看哈 谢谢
--------------------编程问答-------------------- 好的 看看哈 谢谢
--------------------编程问答-------------------- 很好很好,顶。。。。。。。 --------------------编程问答-------------------- --------------------编程问答-------------------- thank you ,you are a good man  --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 这个得收藏~~ --------------------编程问答-------------------- 收藏啊  慢慢学习 --------------------编程问答-------------------- 好长时间没看C#都快看不懂了,学习了 --------------------编程问答-------------------- 又学到了一种窗体间传值的方法! --------------------编程问答-------------------- 不错的分享~~~~ --------------------编程问答--------------------   henhao --------------------编程问答-------------------- 原来还有这么个写法啊  学习了 --------------------编程问答--------------------

public partial class Form2 : Form
    {

        private Form1 m_parent;

        public Form2(Form1 frm1)
        {
            InitializeComponent();
            m_parent = frm1;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            m_parent.msgme();
        }
    }
--------------------编程问答-------------------- --------------------编程问答--------------------
引用 19 楼 pro_ah 的回复:
C# code

public partial class Form2 : Form
    {

        private Form1 m_parent;

        public Form2(Form1 frm1)
        {
            InitializeComponent();
            m_parent = frm1;
……

这个就是我所说的那个设计。这样做Form2和Form1被强耦合在一起。
假设Form3也需要调用Form2,那么设计起来就很复杂了。
这种设计在网上流传的文章中出现过,属于不好的设计。 --------------------编程问答-------------------- 不错,我也喜欢这样,想打开对话框、保存对话框、颜色对话框等等都是这样的。 --------------------编程问答-------------------- --------------------编程问答-------------------- 有意思 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 又学到了一种窗体间传值的方法! --------------------编程问答-------------------- 隔离了,就是好 --------------------编程问答-------------------- --------------------编程问答-------------------- 了解了 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 楼主用使用Lambda 表达式估计很多新手要看一下的 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 我是初学者, --------------------编程问答--------------------
引用 34 楼 deltallp 的回复:
引用 2 楼 jodem 的回复:
好东西,顶起来
............................
--------------------编程问答-------------------- --------------------编程问答--------------------

研究下 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 楼主辛苦了  谢谢 --------------------编程问答-------------------- --------------------编程问答-------------------- 悲剧,你不闲麻烦呀 ~~~

自己在子窗体里面定义委托和事件,在父窗体show子窗体之前,给子窗体事件绑定方法,不就OK了。。。

既然是模态窗体,你有必要声明是全局的么? --------------------编程问答-------------------- 虽说你的思路跟我讲的是一样,看得累啊!~~兄弟 ~ --------------------编程问答--------------------
引用 50 楼 welcomechenqi 的回复:
悲剧,你不闲麻烦呀 ~~~

自己在子窗体里面定义委托和事件,在父窗体show子窗体之前,给子窗体事件绑定方法,不就OK了。。。

既然是模态窗体,你有必要声明是全局的么?

定义的窗体私有变量是为非模态版本的调用准备的。
我将两个例子合并到一个程序中。

感谢反馈。 --------------------编程问答-------------------- jfzr --------------------编程问答-------------------- --------------------编程问答-------------------- m_dlg.TextBoxChanged += new EventHandler(
                    (sender1, e1) =>
                    { richTextBox1.Text = m_dlg.TextBoxValue; }
                );
                m_dlg.FormClosed += new FormClosedEventHandler(
                    (sender2, e2) => { m_dlg = null; }
                );


问下:=>  是什么意思?
--------------------编程问答-------------------- 不错,谢谢发帖。 --------------------编程问答--------------------
引用 55 楼 hc_look 的回复:
m_dlg.TextBoxChanged += new EventHandler(
  (sender1, e1) =>
  { richTextBox1.Text = m_dlg.TextBoxValue; }
  );
  m_dlg.FormClosed += new FormClosedEventHandler(
  (sender2, e2) => { m_dlg = null……

m_dlg.TextBoxChanged += new EventHandler(
  (sender1, e1) =>
  { richTextBox1.Text = m_dlg.TextBoxValue; }
  );
相当于:
m_dlg.TextBoxChanged += new EventHandler(m_dlg_textboxchanged);

...

private void m_dlg_textboxchanged(object sender1, EventArgs e1)
{
    richTextBox1.Text = m_dlg.TextBoxValue;
}
--------------------编程问答--------------------
引用 57 楼 caozhy 的回复:
引用 55 楼 hc_look 的回复:
m_dlg.TextBoxChanged += new EventHandler(
(sender1, e1) =>
{ richTextBox1.Text = m_dlg.TextBoxValue; }
);
m_dlg.FormClosed += new FormClosedEventHandler(
(sender2, e2) => { ……

谢谢,明白了。 --------------------编程问答-------------------- --------------------编程问答-------------------- 先顶下了!~~~ --------------------编程问答-------------------- shou cangle  --------------------编程问答-------------------- 呵呵,委托事件,不是新鲜事了 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 我08年的时候做的是传个窗体,憋了一天想出来的,现在用委托,轻松优雅,还拉轰~ --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 也不是很好,主要是子窗体写得不好,TextBoxValue和textBox1_TextChanged没规划好,每传进一个值就触发一个TextChanged事件,然后又返回给主窗体,这步不是多余了么? --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答--------------------

public partial class Form2 : Form
    {
        private Form1 m_parent;
        public Form2(Form1 frm1)
        {
            InitializeComponent();
            m_parent = frm1;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            m_parent.msgme();
        }
    }


提一个 interface 出来 成

public interface IChangeComponent 
{
 msgme(CustomMessage cms);
}
public partial class Form2 : Form
    {
        private IChangeComponent m_parent;
        public Form2(IChangeComponent frm1)
        {
            InitializeComponent();
            m_parent = frm1;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            CustomMessage cms = *****;
            if(m_parent!=null)             
               m_parent.msgme(cms);
        }
    }


假设Form3也需要调用Form2,Form3实现接口即可。

个人觉得这里用委托也是有接口的思想
if (TextBoxChanged != null)
    TextBoxChanged(this, e);

if(m_parent!=null)             
     m_parent.msgme(cms);

代码量差不多,呵呵 --------------------编程问答-------------------- 只是接口不能多播! --------------------编程问答-------------------- --------------------编程问答--------------------
引用 77 楼 bonnibell 的回复:
C# code

public partial class Form2 : Form
    {
        private Form1 m_parent;
        public Form2(Form1 frm1)
        {
            InitializeComponent();
            m_parent = frm1;
   ……

接口适合耦合比较紧密情况下的设计,而事件的耦合则松散一些。

很明显,如果使用接口,那么客户端代码必须引用到这个接口,并且附加定义到每个调用的窗体类上。

显然这样的设计不如使用事件。 --------------------编程问答--------------------

public Form2(IChangeComponent frm1)
        {
            InitializeComponent();
            m_parent = frm1;
        }


看到有人这样把窗体传来传去的就不爽 --------------------编程问答-------------------- 嗯。。。有意思,对于这个耦合还不是很理解,得学习下 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 子类定义一个结构保存信息,,窗口之间的消息都用发送的方法吧!!!具体的接收后的处理方法,交给接收方处理吧!!!(个人想法) --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 真是高手啊,论坛人才济济 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 比较同意上面的结构体打包的思想 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 其实,如果不考虑耦合。最简单办法就是在一个公共地方,弄个静态变量。。。 --------------------编程问答-------------------- --------------------编程问答--------------------
引用 95 楼 wuyazhe 的回复:
其实,如果不考虑耦合。最简单办法就是在一个公共地方,弄个静态变量。。。


于是有了MVC。 --------------------编程问答-------------------- --------------------编程问答-------------------- LZ好!LZ觉得这种方法,与委托事件相比,哪个性能 上会更好一点? --------------------编程问答--------------------
引用 99 楼 lwbjyl 的回复:
LZ好!LZ觉得这种方法,与委托事件相比,哪个性能 上会更好一点?

我给出的就是使用委托/事件的方法。

而且在窗体调用的情况下,性能往往并不是需要讨论的问题。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,