65.9K
CodeProject 正在变化。 阅读更多。
Home

使用枚举创建自定义对话框

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.31/5 (6投票s)

2008年6月10日

CPOL

2分钟阅读

viewsIcon

25163

使用枚举创建自定义对话框

引言

本文旨在通过一个实际示例来解释枚举。你是否见过带有“全部拒绝”按钮的内置对话框? 在我参与的一个项目中,我需要一个带有“否”、“全部拒绝”、“是”、“全部接受”等按钮的对话框。 我们可以使用 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. 可读性差:如果我们看到这段代码,很难理解 1、2 和 3 代表什么?
  2. 类型不安全:这些不是类型安全的。 我们不是传递 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);

优点

  1. 更易读
  2. 完全类型安全。

让我们使用枚举创建一个可重用的对话框

打开一个类库,并将一个窗体(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.
        
       
 
                    .

编码愉快!!!!

© . All rights reserved.