在Windows窗体中提示对话框

我正在使用System.Windows.Forms但奇怪的是没有能力来创build它们。

我怎样才能得到像JavaScript提示对话框,没有JavaScript?

MessageBox很好,但用户无法inputinput。

您需要创build您自己的提示对话框。 你也许可以为此创build一个类。

 public static class Prompt { public static string ShowDialog(string text, string caption) { Form prompt = new Form() { Width = 500, Height = 150, FormBorderStyle = FormBorderStyle.FixedDialog, Text = caption, StartPosition = FormStartPosition.CenterScreen }; Label textLabel = new Label() { Left = 50, Top=20, Text=text }; TextBox textBox = new TextBox() { Left = 50, Top=50, Width=400 }; Button confirmation = new Button() { Text = "Ok", Left=350, Width=100, Top=70, DialogResult = DialogResult.OK }; confirmation.Click += (sender, e) => { prompt.Close(); }; prompt.Controls.Add(textBox); prompt.Controls.Add(confirmation); prompt.Controls.Add(textLabel); prompt.AcceptButton = confirmation; return prompt.ShowDialog() == DialogResult.OK ? textBox.Text : ""; } } 

并称之为:

 string promptValue = Prompt.ShowDialog("Test", "123"); 

更新

添加默认button( input键 )和基于评论和另一个问题的初始焦点。

添加引用到Microsoft.VisualBasic并将其用于您的C#代码:

 string input = Microsoft.VisualBasic.Interaction.InputBox("Prompt", "Title", "Default", 0, 0); 

Windows窗体中不存在这样的东西。

您必须为此创build自己的表单或:

使用Microsoft.VisualBasic参考。

Inputbox是传统的代码带入.Net的VB6兼容性 – 所以我build议不要这样做。

将VisualBasic库导入C#程序通常并不是一个好主意(不是因为它们不能工作,而是为了兼容性,样式和升级能力),但是可以调用Microsoft.VisualBasic.Interaction.InputBox()显示你正在寻找的那种盒子。

如果你可以创build一个Windows.Forms对象,那最好,但是你说你不能这么做。

其他方法:假设您有一个TextBoxinputtypes,创build一个窗体,并具有作为公共属性的文本框的值。

 public partial class TextPrompt : Form { public string Value { get { return tbText.Text.Trim(); } } public TextPrompt(string promptInstructions) { InitializeComponent(); lblPromptText.Text = promptInstructions; } private void BtnSubmitText_Click(object sender, EventArgs e) { Close(); } private void TextPrompt_Load(object sender, EventArgs e) { CenterToParent(); } } 

在主要的forms,这将是代码:

 var t = new TextPrompt(this, "Type the name of the settings file:"); t.ShowDialog() 

;

这样,代码看起来更干净:

  1. 如果validation逻辑被添加。
  2. 如果添加其他各种inputtypes。

您将不得不为此创build一个新窗体,然后显示它。

创build一个简单的input框forms的一些例子可以在这里find: http : //www.bing.com/search?setmkt= en-GB&q=C%23+input+box

Bas Brekelmans的回答非常简洁。 但是,我发现对于一个实际的应用程序,需要多一点,比如:

  • 消息文本太长时,应适当增长表单。
  • 不会自动在屏幕中间popup。
  • 不提供任何用户inputvalidation。

这里的类处理这些限制: http : //www.codeproject.com/Articles/31315/Getting-User-Input-With-Dialogs-Part-1

我刚刚下载源代码并将InputBox.cs复制到我的项目中。

惊讶的是没有什么更好的,虽然…我唯一真正的抱怨是它的标题文字不支持新行,因为它使用标签控制。

基于上述Bas Brekelmans的工作,我还创build了两个派生 – >“input”对话框,允许您从用户接收文本值和布尔值(TextBox和CheckBox):

 public static class PromptForTextAndBoolean { public static string ShowDialog(string caption, string text, string boolStr) { Form prompt = new Form(); prompt.Width = 280; prompt.Height = 160; prompt.Text = caption; Label textLabel = new Label() { Left = 16, Top = 20, Width = 240, Text = text }; TextBox textBox = new TextBox() { Left = 16, Top = 40, Width = 240, TabIndex = 0, TabStop = true }; CheckBox ckbx = new CheckBox() { Left = 16, Top = 60, Width = 240, Text = boolStr }; Button confirmation = new Button() { Text = "Okay!", Left = 16, Width = 80, Top = 88, TabIndex = 1, TabStop = true }; confirmation.Click += (sender, e) => { prompt.Close(); }; prompt.Controls.Add(textLabel); prompt.Controls.Add(textBox); prompt.Controls.Add(ckbx); prompt.Controls.Add(confirmation); prompt.AcceptButton = confirmation; prompt.StartPosition = FormStartPosition.CenterScreen; prompt.ShowDialog(); return string.Format("{0};{1}", textBox.Text, ckbx.Checked.ToString()); } } 

…和文本以及多个选项(TextBox和ComboBox)之一的select:

 public static class PromptForTextAndSelection { public static string ShowDialog(string caption, string text, string selStr) { Form prompt = new Form(); prompt.Width = 280; prompt.Height = 160; prompt.Text = caption; Label textLabel = new Label() { Left = 16, Top = 20, Width = 240, Text = text }; TextBox textBox = new TextBox() { Left = 16, Top = 40, Width = 240, TabIndex = 0, TabStop = true }; Label selLabel = new Label() { Left = 16, Top = 66, Width = 88, Text = selStr }; ComboBox cmbx = new ComboBox() { Left = 112, Top = 64, Width = 144 }; cmbx.Items.Add("Dark Grey"); cmbx.Items.Add("Orange"); cmbx.Items.Add("None"); Button confirmation = new Button() { Text = "In Ordnung!", Left = 16, Width = 80, Top = 88, TabIndex = 1, TabStop = true }; confirmation.Click += (sender, e) => { prompt.Close(); }; prompt.Controls.Add(textLabel); prompt.Controls.Add(textBox); prompt.Controls.Add(selLabel); prompt.Controls.Add(cmbx); prompt.Controls.Add(confirmation); prompt.AcceptButton = confirmation; prompt.StartPosition = FormStartPosition.CenterScreen; prompt.ShowDialog(); return string.Format("{0};{1}", textBox.Text, cmbx.SelectedItem.ToString()); } } 

两者都需要相同的使用:

 using System; using System.Windows.Forms; 

像这样称呼他们:

像这样称呼他们:

 PromptForTextAndBoolean.ShowDialog("Jazz", "What text should accompany the checkbox?", "Allow Scat Singing"); PromptForTextAndSelection.ShowDialog("Rock", "What should the name of the band be?", "Beret color to wear"); 

Microsoft.VisualBasic.Interaction.InputBox有几个缺点。 如果用户点击确定或取消,如何pipe理? 你不能。

你应该写你自己的类或使用像OOKII对话框的InputControl。 OOKII很棒。

Bas的答案可以让你在记忆中理论上讲,因为ShowDialog不会被丢弃。 我认为这是一个更正确的方法。 还要提到textLabel可以用更长的文本阅读。

 public class Prompt : IDisposable { private Form prompt { get; set; } public string Result { get; } public Prompt(string text, string caption) { Result = ShowDialog(text, caption); } //use a using statement private string ShowDialog(string text, string caption) { prompt = new Form() { Width = 500, Height = 150, FormBorderStyle = FormBorderStyle.FixedDialog, Text = caption, StartPosition = FormStartPosition.CenterScreen, TopMost = true }; Label textLabel = new Label() { Left = 50, Top = 20, Text = text, Dock = DockStyle.Top, TextAlign = ContentAlignment.MiddleCenter }; TextBox textBox = new TextBox() { Left = 50, Top = 50, Width = 400 }; Button confirmation = new Button() { Text = "Ok", Left = 350, Width = 100, Top = 70, DialogResult = DialogResult.OK }; confirmation.Click += (sender, e) => { prompt.Close(); }; prompt.Controls.Add(textBox); prompt.Controls.Add(confirmation); prompt.Controls.Add(textLabel); prompt.AcceptButton = confirmation; return prompt.ShowDialog() == DialogResult.OK ? textBox.Text : ""; } public void Dispose() { prompt.Dispose(); } } 

执行:

 using(Prompt prompt = new Prompt("text", "caption")){ string result = prompt.Result; } 

这里是VB.NET中的一个例子

 Public Function ShowtheDialog(caption As String, text As String, selStr As String) As String Dim prompt As New Form() prompt.Width = 280 prompt.Height = 160 prompt.Text = caption Dim textLabel As New Label() With { _ .Left = 16, _ .Top = 20, _ .Width = 240, _ .Text = text _ } Dim textBox As New TextBox() With { _ .Left = 16, _ .Top = 40, _ .Width = 240, _ .TabIndex = 0, _ .TabStop = True _ } Dim selLabel As New Label() With { _ .Left = 16, _ .Top = 66, _ .Width = 88, _ .Text = selStr _ } Dim cmbx As New ComboBox() With { _ .Left = 112, _ .Top = 64, _ .Width = 144 _ } cmbx.Items.Add("Dark Grey") cmbx.Items.Add("Orange") cmbx.Items.Add("None") cmbx.SelectedIndex = 0 Dim confirmation As New Button() With { _ .Text = "In Ordnung!", _ .Left = 16, _ .Width = 80, _ .Top = 88, _ .TabIndex = 1, _ .TabStop = True _ } AddHandler confirmation.Click, Sub(sender, e) prompt.Close() prompt.Controls.Add(textLabel) prompt.Controls.Add(textBox) prompt.Controls.Add(selLabel) prompt.Controls.Add(cmbx) prompt.Controls.Add(confirmation) prompt.AcceptButton = confirmation prompt.StartPosition = FormStartPosition.CenterScreen prompt.ShowDialog() Return String.Format("{0};{1}", textBox.Text, cmbx.SelectedItem.ToString()) End Function