消息框控件

分享于 

8分钟阅读

Web开发

  繁體

介绍

大多数应用程序或者所有应用程序都需要一种机制,在必要时通知用户。 在 Windows 应用程序中,通过提供模式对话框,MessageBox [ ^ ] 可以解决这里问题:

  • 可以表示消息源来源的标题 。
  • 用于确定消息框的重要性的每个消息类型的icon
  • 简短文本消息
  • 一些可以代表用户决策的命令按钮
  • 以及一个独特的系统声音,它告诉我们消息框是多么重要
save cofirmation

不幸的是,在web应用程序中,这里特性不存在。 this alert()confirm() 被替换,设计者不能控制它。

alertconfirm

在本文中,我们将介绍一个像 Windows 应用程序一样的消息框,但是有额外的设计特性和处理web环境的行为。

Style1Style1

背景

本文基于确认消息框中讨论的概念,从 System.Windows.Forms.MessageBox [^ ] 类中的一些特性 [ ^ ]。

使用代码

控件和 System.Windows.Forms.MessageBox [ ^ ] 一样提供 Show() 方法重载,它还提供了带有附加参数的RegisterButtonForShowigMessage(),用来保存按钮引用。

该控件还提供了 MessageBoxButtonAction 类型的三个额外参数,这些参数有四个值:

  • Undefined: 不执行任何操作
  • AcceptDialog: 用于触发呼叫按钮的postback 事件
  • Close: 用于关闭对话框并在客户端引发
    ClientResultReturn
    事件
  • PostBack: 用于关闭对话框并在服务器端引发 ResultReturn 事件

控件还提供了 String 类型的八个属性来自定义按钮上的文本。

  • OKButtonText: 用于"行"命令按钮文本
  • CancelButtonText: 用于"取消"命令按钮文本
  • AbortButtonText: 用于"中止"命令按钮文本
  • RetryButtonText: 用于"重试"命令按钮文本
  • IgnoreButtonText: 用于"忽略"命令按钮文本
  • YesButtonText: 用于"是"命令按钮文本
  • NoButtonText: 用于"没有"命令按钮文本
  • CloseButtonText: 对话框关闭按钮文本

你可以像下面这样使用控件:

MessageBox MessageBox1 = MessageBox.GetCurrent(this);
MessageBox1.OnClientResultReturn = "OnCloseDialig";
MessageBox1.RegisterButtonForShowigMessage(cmdClose, 
 "Do you want to save this transaction before exiting the page?",
 "My Application", "Exit", MyControls.MessageBoxButtons.YesNoCancel,
 MyControls.MessageBoxIcon.Exclamation, MyControls.MessageBoxDefaultButton.Button1,
 MyControls.MessageBoxButtonAction.PostBack,
 MyControls.MessageBoxButtonAction.PostBack, 
 MyControls.MessageBoxButtonAction.Close);

你还可以添加一个处理 ClientResultReturn 事件的JavaScript函数,就像下面这样:

function OnCloseDialig(sender, e) {
 var args = sender.get_Tag().split(',');
 if (args[0] == 'Copy')
 if (e.get_DialogResult() == MyControls.DialogResult.Abort ||
 e.get_DialogResult() == MyControls.DialogResult.OK)
 $get('<%= loader.ClientID %>').style.display = 'none';
}

这里方法将在消息框关闭后被调用。

若要处理控件的服务器端事件 ResultReturn,只需向事件中添加一个处理程序。 在处理方法中,为消息源和事件参数的DialogResult 属性使用 thTag 属性。 例如:

void MessageBox1_ResultReturn(object sender, MessageBoxEventArgs e)
{
 MessageBox MessageBox1 = (sender as MessageBox );
 string[] args = MessageBox1.Tag.Split(new char[] { ',' },
 StringSplitOptions.RemoveEmptyEntries);
 string command = string.Empty;
 string[] commandargs = null;
 if (args.Length >0)
 command = args[0];
 if (args.Length >1)
 {
 commandargs = new string[args.Length - 1];
 for (int i = 1; i > args.Length; i++)
 commandargs[i - 1] = args[i];
 }
 switch (command)
 {
 case"Copy":
 ContiueCoping(e.DialogResult, commandargs[0]);
 break;
 case"Exit":
 ExitPage(e.DialogResult);
 break;
 }
}

最后,通过将 OpenDialog() 函数添加到脚本块中,我们可以调用与前面讨论的Show() 相同的参数 GetOpenDialogReference()。 如下所示:

StringBuilder validateSelectionBuilder = new StringBuilder();
validateSelectionBuilder.AppendLine("function ValidateSelection(sender, e){");
validateSelectionBuilder.AppendLine(" var count = getCheckedItemsCount('AddItems');");
validateSelectionBuilder.AppendLine(string.Format(
 " if(count == 0) {{ {0} e.IsValid = false; }}", 
 MessageBox1.GetOpenDialogReference("Please select at least one item.", 
 "My Application", "AddItems", 
 MessageBoxButtons.OK, MessageBoxIcon.Exclamation, 
 MessageBoxDefaultButton.Button1, 
 new MessageBoxButtonsAcionProvider(MessageBoxButtonAction.Close))));
validateSelectionBuilder.AppendLine(string.Format(
 " else if(count> 3) {{ {0} e.IsValid = false; }}", 
 MessageBox1.GetOpenDialogReference(
 "You can not add more than three items at a time.", "My Application", 
 "AddItems", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, 
 MessageBoxDefaultButton.Button1, 
 new MessageBoxButtonsAcionProvider(MessageBoxButtonAction.Close))));
validateSelectionBuilder.AppendLine(" else e.IsValid = true;");
validateSelectionBuilder.AppendLine("}");

Points of Interest

不需要确认消息框 [ ^ ],我们不需要保存消息框对象的多个实例。 所以我们首先将对象添加到 OnInit() 方法中的Page.Items Collection。

protectedoverridevoid OnInit(EventArgs e)
{
 base.OnInit(e);
 if (!base.DesignMode)
 {
 if (GetCurrent(this.Page)!= null)
 {
 thrownew InvalidOperationException(
 "Only One MessageBox instance is allowed.");
 }
 Page iPage = this.Page;
 iPage.Items[typeof(MessageBox)] = this;
 }
}

然后,使用 MessageBox.GetCurrent() 方法从任何内容页中使用该集合,它的主页包含控件甚至页中的控件。

publicstatic MessageBox GetCurrent(Page page)
{
 if (page == null)
 {
 thrownew ArgumentNullException("page");
 }
 return (page.Items[typeof(MessageBox)] as MessageBox);
}

历史记录

  • 星期六,2011年05月14日
    • 第一个版本。
  • 星期日,2011年05月15日
    • 添加了描述 ClientResultReturn的段落
  • 星期一,June,6
    • 添加了描述事件 ResultReturn的段落
    • 更改控件的HTML布局
    • 修改控件的默认样式
    • 添加了一个示例 。htm文件
    • 在兼容性视图中修复了JavaScript函数 OpenDialog()
    • 当从服务器端调用
      Show()
      方法时,修复了JavaScript函数 AcceptDialog()的行为
  • 星期日,2011年10月30日
    • 改变了文章的介绍
    • 修正了 Google Chrome 上的JavaScript错误
    • 添加了 GetOpenDialogReference() 方法和描述它的段落
  • 星期四,2012年03月22日
    • IE6中的固定样式问题。
    • 编辑了包含全球化的示例。

控制  Message  BOX  
相关文章