使用枚举创建自定义对话框
使用枚举创建自定义对话框
引言
本文旨在通过一个实际示例来解释枚举。你是否见过带有“全部拒绝”按钮的内置对话框? 在我参与的一个项目中,我需要一个带有“否”、“全部拒绝”、“是”、“全部接受”等按钮的对话框。 我们可以使用 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.
        
       
 
                    .
编码愉快!!!!



