C#,winform,ShowDialog,子窗体向父窗体传值

调用showdialog方法后,调用代码被暂停执行,等到调用showdialog方法的窗体关系后再继续执行。而且窗体可以返回一个dialogresult值,他描述了窗体关闭的原因,例如OK,Cancel,yes,no等。为了让窗体返回一个dialogresult,必须设置窗体的dialogresult值,或者在窗体的一个按钮上设置dialogresult属性。

例子:
下面是子窗体代码,要求输入phone,然后会返回给父窗体。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication1
{
    public partial class Phone : Form
    {
        public Phone()
        {
            InitializeComponent();
            btnOK.DialogResult = DialogResult.OK;
            btnOK.DialogResult = DialogResult.Cancel;
        }
        public string PhoneNumber
        {
            get { return textBox1.Text; }
            set { textBox1.Text = value; }
        }
        private void Phone_Load(object sender, EventArgs e)
        {

}
    }
}

不包含任何处理按钮单击事件的代码,因为设置了每个按钮的dialogresult属性,所以单击OK或者Cancel按钮后,窗体就消失了。下面的代码显示了父窗体中调用Phone对话框的方法。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication1
{
    public partial class Form7 : Form
    {
        public Form7()
        {
            InitializeComponent();
        }

private void button1_Click(object sender, EventArgs e)
        {
            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();
        }
    }
}

看起来非常简单,创建新的Phone对象frm,在调用frm.showdialog方法是,代码停止,等待phone窗体返回,接着检查phone窗体的dialogresult属性,由于窗体还没有释放,是不可见的,所以仍可以访问公共属性phonenumber,一旦获取了需要的数据,就可以嗲用窗体的close方法。
一切正常,但是如果返回的格式不正确怎么办,就要把showdialog方法放在循环中,就可以再次调用,让用户重新输入,就可以得到正确的值。

上面的代码改成下面的即可。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication1
{
    public partial class Form7 : Form
    {
        public Form7()
        {
            InitializeComponent();
        }

private void button1_Click(object sender, EventArgs e)
        {
            Phone frm = new Phone();

while (true)
            {
                frm.ShowDialog();
                if (frm.DialogResult == DialogResult.OK)
                {
                    label1.Text = "Phone number is " + frm.PhoneNumber;
                    if (frm.PhoneNumber.Length == 8 || frm.PhoneNumber.Length == 12)
                    {
                        break;
                    }
                    else
                    {
                        MessageBox.Show("");
                    }
                }
                else if (frm.DialogResult == DialogResult.Cancel)
                {
                    label1.Text = "form was canceled";
                    break;
                }
            }
            frm.Close();
        }
    }
}

(0)

相关推荐

  • 解决C#中取消方向键对控件焦点控制的实现方法

    在C# winform 应用程序中,对于键盘响应事件,经常使用到"KeyPress"."KeyUp"."KeyDown"事件,可以处理某个按键的自定义处理事件.有时想定义方向键的自定义处理事件时,你可以发现,虽然自定义的处理事件发生了响应,但是也可以看到,按下方向键时,发现窗体上控件的焦点也发生了切换.而这种结果不是我们想要的,我们不想按下方向键时,控件的焦点发生切换,只想响应我们自定义的处理函数即可.下面的方法可以取消方向键对控件焦点的控制:

  • C#设置子窗体在主窗体中居中显示解决方案

    问题的开始是由C#传传看主群里的印醒提出来的,下面我来说一下解决方案吧 其实表面上看是很简单的 开始吧,现在有两个窗体Form1主窗体,Form2子窗体 而且我相信大部分人都会这样写 在子窗体的Load事件中 这样写 复制代码 代码如下: this.StartPosition = FormStartPosition.CenterParent; 其实这样写是不对的,正确的写法应该是 复制代码 代码如下: this.StartPosition = FormStartPosition.CenterSc

  • C# WINFORM 强制让窗体获得焦点的方法代码

    复制代码 代码如下: //调用API [System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto, ExactSpelling = true)] public static extern IntPtr GetForegroundWindow(); //获得本窗体的句柄 [System.Runtime.InteropService

  • C#最简单的关闭子窗体更新父窗体的实现方法

    主窗体Form1关键代码: 将子窗体最为对话框模式弹出,当窗体关闭或取消时更新主窗体 复制代码 代码如下: private void simpleButton1_Click(object sender, EventArgs e) { Form2 f2 = new Form2(); f2.Owner = this; DialogResult result=f2.ShowDialog(); if (result == DialogResult.Cancel) { this.gridControl1.

  • C# Winform实现捕获窗体最小化、最大化、关闭按钮事件的方法

    本文实例讲述了C# Winform实现捕获窗体最小化.最大化.关闭按钮事件的方法,主要是通过重写WndProc来实现的.分享给大家供大家参考.具体方法如下: 主要功能代码如下: const int WM_SYSCOMMAND = 0x112; const int SC_CLOSE = 0xF060; const int SC_MINIMIZE = 0xF020; const int SC_MAXIMIZE = 0xF030; protected override void WndProc(ref

  • C# SkinEngine控件 给窗体添加皮肤的方法

    自己写的一个日历记事本效果图 具体步骤: 1.添加控件SkinEngine.  1.右键"工具箱"."添加选项卡",取名"皮肤".   2.右键"皮肤","选择项"弹出对话框.  3.点击"浏览",找到IrisSkin2.dll,这时你会发现 SkinEngine 的控件已经被打上勾 - 确定.2.将 SkinEngine 控件添加到窗体上.3.把皮肤文件(以ssk为后缀名)放在&quo

  • 用 C# Winform做出全透明的磨砂玻璃窗体效果代码

    首先, 调用系统 API, 这里如果要引用神马的, 就不一一列出了, 大家自己引用一下. 复制代码 代码如下: [StructLayout(LayoutKind.Sequential)] public struct MARGINS { public int Left; public int Right; public int Top; public int Bottom; } [DllImport("dwmapi.dll", PreserveSig = false)] public s

  • c# winform 关闭窗体时同时结束线程实现思路

    前不久,做一个winform小程序,是给客户导数据用的.当时就发现调试的时候,线程有点问题,到某个点时就走不动了.但是运行确实没有问题的. 只是在关闭窗体后,资源管理器里,一大堆进程. 当时,客户急着用,小测了下,导出数据无误,进程就先不管了. 后来自己去查资料,发现只要在线程那里设置个属性 复制代码 代码如下: Thread th = new Thread(Excute); th.IsBackground = true;这样就解决问题了. 这个属性的意思就是把线程设置为后台线程. 然后关闭进程

  • C# 开发圆角控件(窗体)的具体实现

    最近在做卡片视图的程序,要求将控件做成带有圆角的效果,下面是我在网上查找的资料,经过测试,确定可以实现功能.其中方法三既适应于控件,也适应于窗体. 先上传效果图: 方法一: 增加命名空间:using System.Drawing.Drawing2D;  添加方法如下:当然各角的点可根据需要确定. 复制代码 代码如下: private void Type(Control sender, int p_1, double p_2)        {            GraphicsPath oP

  • C#实现让窗体获得焦点的方法示例

    本文实例讲述了C#实现让窗体获得焦点的方法.分享给大家供大家参考,具体如下: 开发环境:Visual Studio .NET 2005 下的Windows Form Application 应用场景:当我们有个窗体中的数据发生了变化而此窗体又没有获得焦点(不是用户操作的当前窗口)的时候,我们希望它获得焦点,这样用户就可以立刻发现它上面的数据发生了变化. 新建一个Window应用程序,会建立Form1,再添加一个Timer(timer1),设置如下属性: 然后添加timer1的Tick事件函数,完

  • C#窗体编程不显示最小化、最大化、关闭按钮的方法

    本文介绍在C#窗体编程时,如何设置不显示右上角的最小化最大化关闭按钮.可以通过this.ControlBox这个属性的值来控制. 在Windows的窗体编程中,基本上每一个窗体都是一个最小化.最大化和关闭按钮的.见惯了千篇一律,我们有时需要有一点新意,比如来把右上角的这最小化.最大化和关闭三个按钮去掉. 对于最大化和最小化按钮,在C#窗体开发时,各一个属性来启用或禁用这两个按钮.对于最大化来说,this.MaximizeBox=false即可禁用最大化按钮.而这里的this是指窗体对象本身.而t

  • C#实现让窗体永远在窗体最前面显示的实例

    本文以实例描述了C#实现让窗体永远在窗体最前面显示的方法,具体步骤如下: 1.新建一个窗体程序,添加一个Timer以及设置它可用并绑定事件. 2.设置窗体的TopMost属性为True 3.然后设置代码如下即可实现. using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; usin

随机推荐