使用枚举创建自定义对话框
使用枚举创建自定义对话框
引言
本文旨在通过一个实际示例来解释枚举。你是否见过带有“全部拒绝”按钮的内置对话框? 在我参与的一个项目中,我需要一个带有“否”、“全部拒绝”、“是”、“全部接受”等按钮的对话框。 我们可以使用 WinForm 和 C# 枚举轻松创建这样的对话框。
枚举
枚举是值类型,在栈上创建,而不是在堆上创建。 它们需要更少的处理器和内存资源,而这些资源是应用程序运行所必需的。 你不需要使用 `new` 来创建枚举类型。
public enum Seasons { winter, summer, autumn}
枚举是一个命名常量,其底层类型是任何整型,但不包括 char。 如果没有声明底层类型,则使用 Int32。 C# 通常提供语法来声明一个枚举,该枚举由一组命名常量及其值组成。
public enum Seasons { Winter = 1, summer = 2, autumn = 3 }
数值的赋值是可选的。 默认情况下,数字从零开始,但可以被覆盖。 使用点符号访问单个枚举器。
枚举器可以使代码更简洁、更易于阅读。 枚举帮助我们摆脱那些在代码模块内具有特定目的,但会使代码更难阅读的数字。
让我们讨论一下使用常量或直接使用数字的一些缺点。
public void ShowSeason(int option)
{
switch(option)
{
case 1 :
MessageBox.Show("Winter");
break;
case 2 :
MessageBox.Show("summer");
break;
case 3 :
MessageBox.Show("Autumn");
break;
}
}
要显示冬季,我们必须像这样调用 ShowSeason
ShowSeason(1);
这种代码存在一些问题:
- 可读性差:如果我们看到这段代码,很难理解 1、2 和 3 代表什么?
- 类型不安全:这些不是类型安全的。 我们不是传递 1,而是可以传递像 -999 这样的数字,这在我们的上下文中毫无意义。
还有很多缺点。 让我们使用枚举转换上面的代码,看看它是如何解决上述问题的。
声明枚举
Public enum Seasons {Winterm, Summer, Autumn}
在函数 "ShowSeason" 中使用上面的枚举
public void ShowSeason(Seasons s) // It accepts parameter of type Seasons only.
{ // Cannot pass arbitrary number like -999. Hence
Switch(s) //type safe.
{
case Seasons.winter :
MessageBox.Show("Winter");
break;
case Seasons.Summer :
MessageBox.Show("Summer");
break;
case Seasons.Autumn :
MessageBox.Show("Autumn");
break;
}
}
像这样调用该函数
ShowFunction(Seasons.Winter);
优点
- 更易读
- 完全类型安全。
让我们使用枚举创建一个可重用的对话框
打开一个类库,并将一个窗体(MyDialog.cs)拖到其中。 在窗体上放置几个按钮,并将其命名为 btnYes、btnNo、btnNoToAll 等。 此外,拖动一个标签(lblMsg)到窗体上以显示消息。 在 MyDialog.cs 的代码背后编写以下代码。
Public partial class MyDialog : Form
{
public enum Clicked{Yes,No, NoToAll} // Declaring an enum
private Clicked ClickedResult = Clicked.No; //Declare a variable of type Clicked
// and assigned default value.
Public Clicked prtClickedResult // Public property for identifying which
{ // Which button is clicked.
get { return ClickedResult ;}
}
Public MyDialog(string strMsg)
{
InitializeComponent();
lblMsg.Text = strMsg; //Assigning the message say "Wanna delete"
}
Private void btnYes_Clicked(object sender, EventArgs e)
{
ClickedResult = Clicked.Yes;
this.close(); // Closing the dialog
}
private void btnNoToAll_Clicked(object sender,EventArgs e)
{
ClickedResult = Clicked.NoToAll;
this.Close();
}
// Similarly you can write for any type of buttons.
}
大多数内容都自解释。 在这里,每当用户单击任何按钮时,相应按钮的枚举值都会分配给“ClickedResult”,稍后我们的应用程序将通过公共属性“prtClickedResult”访问该值。
为了使用它,构建类库并将 dll 包含到你的应用程序中,然后编写以下代码
string strMsg = "Are you sure you want to delete this file"
MyDialogs.MyDialog obj = new MyDialogs.MyDialog(strMsg); // Creating object of
// dialog which is in the dll.
obj.ShowDialog(); // Show the form as Dialog
// Now here we have to check which button user has clicked
MyDialogs.MyDialog.Clicked objEnum = obj.prtClickedResult;
// getting which button user has clicked using public
// property which is in our dll.
if(objEnum == MyDialogs.MyDialog.Clicked.Yes)
{
// Write code for Yes condition
}
else if (objEnum == MyDialogs.MyDialog.Clicked.NoToAll)
{
// Write code for No To All condition
}
// Like this write coditions according to the number and type of button you
// have in the dll.
.
编码愉快!!!!