http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 15471|回复: 4

[其他] 使用ShowDialog()方法在两个窗体中传递消息——摘自《C#高级编程》

[复制链接]
发表于 2013-1-17 12:49:03 | 显示全部楼层 |阅读模式
     为了让用户与应用程序交互,用户必须能看到窗体。利用Show和ShowDialog方法就可以实现这一点。Show方法仅使窗体对用户可见。这是很简单的。但它的一个缺点是没有给调用代码发送任何通知,说明调用的窗体已处理完,并退出。有时这不重要,Show方法工作的很好。如果需要提供某种通知,使用ShowDialog方法是一种比较好的选择。
   在调用Show方法后,Show方法后面的代码会立即执行。在调用ShowDialog方法后,调用代码被暂停执行,等到调用ShowDialog方法的窗体关闭后再继续执行。不仅调用代码被暂停执行,而且窗体也可以返回一个DialogResult值。DialogResult枚举是一组标识符,它们描述了对话框关闭的原因,包括OK,Cancel,Yes,No和其他几个标识符。为了让窗体返回一个DialogResult值,必须设置窗体的DialogResult属性,或者在窗体的一个按钮上设置DialogResult属性。
   例如,假定应用程序的一部分要求提供客户的电话号码。窗体包含一个输入电话号码的文本框,和两个按钮OK和Cancel。如果把OK按钮的DialogResult属性设置为DialogResult.OK,把Cancel按钮的DialogResult属性设置为DialogResult.Cancel,则在选择其中一个按钮时,窗体就会不可见,并给调用它的窗体返回相应的DialogResult值。现在注意窗体没有释放,只是把Visible属性设置为false。这是因为仍必须从窗体中获取值。在这个示例中,我们需要电话号码。在窗体上为电话号码创建一个属性,这样父窗体就可以获取值,并调用窗体上的Close方法了。下面是子窗体的代码:
[code=csharp]namespace ChildForm
{
    public partial class Phone : Form
    {
        public Phone()
        {
            InitializeComponent();

            btnOK.DialogResult = DialogResult.OK;
            btnCancel.DialogResult = DialogResult.Cancel;
        }

        public string PhoneNumber
        {
            get
            {
                return txtPhone.Text;
            }
            set
            {
                txtPhone.Text = value;
            }
        }
    }
}[/code]
     首先要注意,不包含处理按钮的单击事件的代码。因为设置了每个按钮的DialogResult属性,所以在单击OK和Cancel按钮后,窗体就消失了。添加的唯一属性时PhoneNumber。下面的代码显示了父窗体中调用Phone对话框的方法:
       [code=csharp]Phone frm = new Phone();

            frm.ShowDialog();
            if (frm.DialogResult == DialogResult.OK)
            {
                label1.Text = "Phone number is " + frm.PhoneNumber;
            }

            else if (frm.DialogResult == DialogResult.Cancel)
            {
                label1.Text = "Form was canceled.";
            }

            frm.Close();[/code]
      这看起来非常简单。创建新的Phone对象frm,在调用frm.ShowDialog()方法时,这个方法中的代码会停止执行,等待Phone窗体返回。接着检查Phone窗体的DialogResult属性。由于窗体还未释放,是不可见的,所以仍可以访问公共属性,其中一个公共属性就是PhoneNumber.一旦获取了需要的数据,就可以调用窗体的Close方法。
    一切正常,但如果返回的电话号码格式不正确,该怎么办?如果把ShowDialog放在循环中,就可以再次调用它,让用户重新输入值。这样就可以得到正确的值,注意,如果用户单击了Cancel按钮,还必须处理DialogResult.Cancel:
    [code=csharp]Phone frm1 = new Phone();

            while (true)
            {
                frm1.ShowDialog();
                if (frm1.DialogResult == DialogResult.OK)
                {
                    label1.Text = "Phone number is " + frm1.PhoneNumber;
                    if (frm1.PhoneNumber.Length == 8 || frm1.PhoneNumber.Length == 12)
                    {
                        break;
                    }
                    else
                        MessageBox.Show("Phone number was not formatted correctly.\n Please correct entry.");
                    }
                }
                else if (frm1.DialogResult == DialogResult.Cancel)
                {
                    label1.Text = "Form was canceld.";
                    break;
                }
            }

            frm1.Close();[/code]
          如果电话号码的长度没有通过简单的测试,Phone窗体就会显示出来,让用户更正错误。ShowDialog框没有创建窗体的新实例,在窗体上输入的文本仍在该窗体上,所以如果必须重新设置窗体,就需要程序员自己完成。


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2013-1-17 13:00:46 | 显示全部楼层
建议楼主下次发代码使用代码标签,这样代码会比较好看,这次的我帮你修改了
 楼主| 发表于 2013-1-17 13:17:55 | 显示全部楼层
admin 发表于 2013-1-17 13:00
建议楼主下次发代码使用代码标签,这样代码会比较好看,这次的我帮你修改了

哦,我不知道怎么用的,谢谢站长了
发表于 2013-1-17 13:31:28 | 显示全部楼层
发表于 2013-1-17 18:34:09 | 显示全部楼层
顶一个,呵呵
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-4-26 17:43

© 2014-2021

快速回复 返回顶部 返回列表