1,标准对话框

Windows内置的对话框,又叫公用对话框,它们作为组件提供的,并且存在于System.Windows.Forms命名空间中。

手工方式:

private void button1_Click_1(object sender, EventArgs e)
{
ColorDialog dlg = new ColorDialog();
dlg.Color = Color.Red;
DialogResult result = dlg.ShowDialog();
if (result == DialogResult.OK)
{
MessageBox.Show("You picked " + dlg.Color.ToString());
}
}

组件方式:

colorDialog1.Color = Color.Red;
DialogResult result = colorDialog1.ShowDialog();
if (result == DialogResult.OK)
{
MessageBox.Show("You Picked " + this.colorDialog1.Color.ToString());
}

可见同样的功能,代码减少不少啊。

常用的标准对话框:

【ColorDialog】

颜色选取,返回值System.Drawing.Color类型的Color属性

【FolderBrowserDialog】

选择文件夹,返回值string类型的SelectdPath属性

【FontDialog】

选择字体,返回值System.Drawing.Font类型的Font

【OpenFileDialog】【SaveFileDialog】

打开或保存文件。返回string类型的FileName

【PageSetupDialog】【PrintDialog】【PrintPreviewDialog】

打印相关

2,窗体风格

相关属性:

ControlBox,FormBorderStyle.HelpButton,MaximizeBox,MinimizeBox,ShowIcon,ShowInTaskbar.

在运行中获取窗体时模式还是非模式:

if(this.Modal)

{

this.FormBorderStyle = FormBorderStyle.FixedDialog;

}

else

{

this.FormBorderStyle = FormBorderStyle.Sizable;

}

3,数据交换

可以直接操作:

Form2 dlg = new Form();

dlg.textBox1.Text = “My Name”;

DialogResult result = dlg.ShowDialog();

if(result==DialogResult.OK)

{

//Do Something

}

弊端如果Form2设计改动时(例如改变TextBox为LabelBox),需要改Form1的代码。

这样做比较好:在Form2中添加公共成员,给外部使用。

public string AppName {
get { return this.textBox1; }
set { this.aStr = value; }
}

调用时候:

Form2 dlg = new Form();

dlg.AppName = “My Name”;

DialogResult result = dlg.ShowDialog();

if(result==DialogResult.OK)

{

//Do Something

}

4,Dialog的返回,处理OK按钮和Cancel按钮

手工处理:

Form1:
private void button3_Click(object sender, EventArgs e)
{
Form2 dlg = new Form2();
dlg.Text = "Jor";
DialogResult result = dlg.ShowDialog();
if (result == DialogResult.OK)
{
MessageBox.Show(dlg.AppName);
} }
Form2:
private void button1_Click_1(object sender, EventArgs e)
{
this.DialogResult = DialogResult.OK;//不用 Close()关闭了,一回事
}

如果窗体需要返回Cancel是一样的:

private void button1_Click_1(object sender, EventArgs e)
{
this.DialogResult = DialogResult.Cancel;
}

手工方式的方式无法将按钮设置成默认按钮,默认按钮是按Enter键调用的那个按钮,按Esc键的时候,Cancel按钮应该被调用。实现这些很简单,只要配置窗体的AcceptButton和CancelButton就可以了。设置好之后发现Cancel按钮的DialogResult属性被自动设置成DialogResult.Cancel了,所以也没必要像手工方式一样去处理Cancel按钮的Click事件的处理程序了。OK也一样,设置好AccepuButton之后,OK按钮的默认值还是DialogResult.None,所以需要手工修改为DialogResult.OK

5,非模式窗体数据传递

与模式窗体的方式不同,需要用户自定义消息以及事件来完成数据交换的功能

在非模式窗体中自定义消息,以及事件触发的条件等。

代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms; namespace WindowsFormsApplication1
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
} public event EventHandler Accept;//定义事件 ***自定义添加(与主窗体处理函数要对应)*** private void button1_Click(object sender, EventArgs e)
{
if (Accept != null)
{
Accept(this, EventArgs.Empty);//按下按钮时触发事件***触发自定义事件***
}
} }
}

在主窗体中进行在非模式窗体中定义的事件与处理函数的绑定。当非模式窗体触发该事件时,由绑定的处理函数进行处理。

代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms; namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
Form2 frm = new Form2();
frm.Accept += MyAccept;
frm.Show();
}
void MyAccept(object sender, EventArgs e)
{
Form2 frm2 = (Form2)sender;
this.label1.Text = frm2.textBox1.Text;//这里是直接调用,需要设置一下textBox1的公开特性。也可用代理方式,推荐。
}
}
}

注意:对于textBox1.Text的调用,默认情况下是不可以的,因为textBox1在Form1.Designer.cs中定义为private,可以改成public然后像这个例子中的方式进行调用。当然,最好用上面做代理的方式进行调用。

public string AppName { get { return this.textBox1; } set { this.aStr = value; } }

6,数据验证

可以添加Validating事件处理,Validating事件当焦点从一个CausesValidation属性为true的控件转移到另外一个CausesValidation属性为true的控件时发生。如果没有取消Validating事件,窗体会通过Validated事件得到通知。

代码:

private void textBox1_Validating(object sender, CancelEventArgs e)
{
if (((Control)sender).Text.Trim().Length == 2)
{
MessageBox.Show("Please enter a name", "Error");
e.Cancel = true;//是否可以切换焦点
}
} private void textBox1_Validated(object sender, EventArgs e)
{
MessageBox.Show("My Name is ," + this.textBox1.Text, "Thanks");
}

为了允许用户在没有输入有效数据的情况下点击Cancel按钮来关闭窗体,我们必须将Cancel或Close按钮的CausesValidatin属性设置为true

        private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.textBox1 = new System.Windows.Forms.TextBox();
this.textBox2 = new System.Windows.Forms.TextBox();
this.SuspendLayout();
//
// button1
//
this.button1.Location = new System.Drawing.Point(190, 198);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(75, 23);
this.button1.TabIndex = 0;
this.button1.Text = "button1";
this.button1.UseVisualStyleBackColor = true;
this.button1.CausesValidation = false; //注意这里
this.button1.Click += new System.EventHandler(this.button1_Click_1);
//
// textBox1
//
       //...

}

其他的可以用正则表达式或掩码文本的方式来进行数据验证

数据格式的通知功能(添加ErrorProvider组件):

private void textBox1_Validating(object sender, CancelEventArgs e)
{
string error = null;
if (((Control)sender).Text.Trim().Length == 0)
{
error = "Please enter a name";
e.Cancel = true;//是否可以切换焦点
}
this.errorProvider1.SetError((Control)sender, error);
}

Windows Forms 对话框篇的更多相关文章

  1. Windows Forms 窗体篇

    1,显示窗体 非模式: Form form = new Form(); form.Show(); 模式: Form form = new Form(); form.Show(); 2,拥有者窗体与附属 ...

  2. Windows Forms 布局篇

    1,锚定功能(Anchor属性) 默认为“Top,Left”,不管窗体大小如果改变,保持相对于窗体左上角的位置. 如果设置为”Top,Bottom,Left,Right”这样,控件的大小将随窗体的大小 ...

  3. C#Windows Forms窗体、按钮-xdd

    1.更换窗体图标 方法:单击窗体,更改icon属性. 2.调整窗体打开时默认位置 方法:单击窗体,更改StartPotion属性. 3.修改窗体大小 方法:单击窗体,更改Size属性. 4.设置窗体的 ...

  4. Wizard Framework:一个自己开发的基于Windows Forms的向导开发框架

    最近因项目需要,我自己设计开发了一个基于Windows Forms的向导开发框架,目前我已经将其开源,并发布了一个NuGet安装包.比较囧的一件事是,当我发布了NuGet安装包以后,发现原来已经有一个 ...

  5. 用户控件的设计要点 System.Windows.Forms.UserControl

    用户控件的设计要点 最近的项目中有一个瀑布图(彩图)的功能,就是把空间和时间上的点量值以图的形式呈现出来,如下图: X坐标为空间,水平方向的一个像素代表一个空间单位(例如50米) Y坐标为时间,垂直方 ...

  6. Windows Forms (一)

    导读 1.什么是 Windows Forms 2.需要学Windows Forms 么? 3.如何手写一个简单的Windows Forms 程序 4.对上面程序的说明 5.Form 类与Control ...

  7. Windows Forms(二)

    导读 1.用VS创建一个Windows Forms程序 2.分析上面的程序 3.Mediator pattern(中介者模式) 4.卡UI怎么办——BackgroundWorker组件 用VS创建一个 ...

  8. 开源自己用python封装的一个Windows GUI(UI Automation)自动化工具,支持MFC,Windows Forms,WPF,Metro,Qt

    首先,大家可以看下这个链接 Windows GUI自动化测试技术的比较和展望 . 这篇文章介绍了Windows中GUI自动化的三种技术:Windows API, MSAA - Microsoft Ac ...

  9. ystem.Windows.Forms.SplitContainer : ContainerControl, ISupportInitialize

    #region 程序集 System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ...

随机推荐

  1. JS关键字 import

    今天开发时使用import作为方法名,报错 后查明报错原因:import是js中的关键字,在取方法名时不能取import

  2. Java并发包之CountDownLatch用法

    CountDownLatch计数器闭锁是一个能阻塞主线程,让其他线程满足特定条件下主线程再继续执行的线程同步工具. Latch闭锁的意思,是一种同步的工具类.类似于一扇门:在闭锁到达结束状态之前,这扇 ...

  3. 洛谷P2891 [USACO07OPEN]吃饭Dining

    题目描述 Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, and she w ...

  4. 通过PXE安装Linux实况

    通过PXE安装Linux实况 网卡引导操作系统的过程我们可以把它称为PXE(Pre-bootExecutionEnvironment),十几年前,在搞无盘NT时候,我们为了使网卡支持PXE引导要特意购 ...

  5. 图形界面备份Linux系统介绍

    详情见: http://os.51cto.com/art/200905/125680.htm             虽然Linux 是一个高度可靠的操作系统,但对于现在复杂的internet环境下, ...

  6. 在物理 Data Guard 中对异构主备系统的支持 (文档 ID 1602437.1)

    Data Guard中主数据库与物理备用数据库(Redo Apply)之间可以有什么差别?本说明针对重做应用和 Oracle Data Guard 12 发行版 1 进行了更新.它适用于 Oracle ...

  7. 获取Spring容器中Bean实例的工具类(Java泛型方法实现)

    在使用Spring做IoC容器的时候,有的类不方便直接注入bean,需要手动获得一个类型的bean. 因此,实现一个获得bean实例的工具类,就很有必要. 以前,写了一个根据bean的名称和类型获取b ...

  8. 如何在win10上同时安装python2和python3

    哎,其实本人已经用惯了python2,听说python3的语法有很多不一样的地方,那我之前写的算法改起来岂不是日了狗了吗?所以一直没改用python3.但是谷歌的那个TensorFlow,在windo ...

  9. 迅雷云监工crysadm搭建

    之前在淘宝众筹买了个迅雷赚钱宝Pro,2016年01月到手,玩了半个月. 之后在看百度贴吧时,看到好多大神都在用PC上用网页版软件来管理赚钱宝.非常是好奇.搜索了非常多资料,基本上都已经过时了.都无法 ...

  10. BZOJ 3675 APIO2014 序列切割 斜率优化DP

    题意:链接 方法:斜率优化DP 解析:这题BZ的数据我也是跪了,特意去网上找到当年的数据后面二十个最大的点都过了.就是过不了BZ. 看到这道题自己第一发DP是这么推得: 设f[i][j]是第j次分第i ...