从对话框中返回值

4
如何在模态对话框表单中发送和返回值。

需要更多信息。你在使用什么框架? - Colin Burnett
一些澄清会很好,是的。在下面的答案中,我假设您正在寻找类似于MessageBox类的输入框,但它接受字符串输入。 - bsneeze
4个回答

5
尝试这个。它被设计作为MessageBox的对应物。但它不会根据操作系统改变样式,看起来像Vista的样式。
以下是其在原始环境(Paint.NET插件)中的示例。它将扩展以适合提示框。
InputBox.cs:

    internal partial class InputBoxForm : Form
    {
        Size lbltextoriginalsize;
        Size pnlwhiteoroginalsize;
        public InputBoxForm(string text, string defaultvalue, string caption)
        {
            InitializeComponent();
            this.pnlWhite.Resize += new System.EventHandler(this.pnlWhite_Resize);
            this.lblText.Resize += new System.EventHandler(this.lblText_Resize);
            picIcon.Image = SystemIcons.Question.ToBitmap();
            lbltextoriginalsize = lblText.Size;
            pnlwhiteoroginalsize = pnlWhite.Size;
            this.lblText.Text = text;
            this.txtOut.Text = defaultvalue;
            this.Text = caption;
        }

        private void lblText_Resize(object sender, EventArgs e)
        {
            pnlWhite.Size += lblText.Size - lbltextoriginalsize;
        }

        private void pnlWhite_Resize(object sender, EventArgs e)
        {
            this.Size += pnlWhite.Size - pnlwhiteoroginalsize;
        }

        public string Value
        {
            get { return txtOut.Text; }
        }
    }

    /// 
    /// A counterpart to the MessageBox class, designed to look similar (at least on Vista)
    /// 
    public static class InputBox
    {
        public static DialogResult Show(string text, out string result)
        {
            return ShowCore(null, text, null, null, out result);
        }
        public static DialogResult Show(IWin32Window owner, string text, out string result)
        {
            return ShowCore(owner, text, null, null, out result);
        }
        public static DialogResult Show(string text, string defaultValue, out string result)
        {
            return ShowCore(null, text, defaultValue, null, out result);
        }
        public static DialogResult Show(IWin32Window owner, string text, string defaultValue, out string result)
        {
            return ShowCore(owner, text, defaultValue, null, out result);
        }
        public static DialogResult Show(string text, string defaultValue, string caption, out string result)
        {
            return ShowCore(null, text, defaultValue, caption, out result);
        }
        public static DialogResult Show(IWin32Window owner, string text, string defaultValue, string caption, out string result)
        {
            return ShowCore(owner, text, defaultValue, caption, out result);
        }

        private static DialogResult ShowCore(IWin32Window owner, string text, string defaultValue, string caption, out string result)
        {
            InputBoxForm box = new InputBoxForm(text, defaultValue, caption);
            DialogResult retval = box.ShowDialog(owner);
            result = box.Value;
            return retval;
        }
    }

InputBox.Designer.cs:

    partial class InputBoxForm
    {
        /// 
        /// Required designer variable.
        /// 
        private System.ComponentModel.IContainer components = null;

        /// 
        /// Clean up any resources being used.
        /// 
        /// true if managed resources should be disposed; otherwise, false.
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// 
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// 
        private void InitializeComponent()
        {
            this.pnlWhite = new System.Windows.Forms.Panel();
            this.lblText = new System.Windows.Forms.Label();
            this.picIcon = new System.Windows.Forms.PictureBox();
            this.txtOut = new System.Windows.Forms.TextBox();
            this.btnOK = new System.Windows.Forms.Button();
            this.btnCancel = new System.Windows.Forms.Button();
            this.pnlWhite.SuspendLayout();
            ((System.ComponentModel.ISupportInitialize)(this.picIcon)).BeginInit();
            this.SuspendLayout();
            // 
            // pnlWhite
            // 
            this.pnlWhite.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
                        | System.Windows.Forms.AnchorStyles.Left)
                        | System.Windows.Forms.AnchorStyles.Right)));
            this.pnlWhite.BackColor = System.Drawing.Color.White;
            this.pnlWhite.Controls.Add(this.lblText);
            this.pnlWhite.Controls.Add(this.picIcon);
            this.pnlWhite.Controls.Add(this.txtOut);
            this.pnlWhite.Location = new System.Drawing.Point(0, 0);
            this.pnlWhite.Margin = new System.Windows.Forms.Padding(0);
            this.pnlWhite.MinimumSize = new System.Drawing.Size(235, 84);
            this.pnlWhite.Name = "pnlWhite";
            this.pnlWhite.Size = new System.Drawing.Size(235, 84);
            this.pnlWhite.TabIndex = 0;
            // 
            // lblText
            // 
            this.lblText.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
                        | System.Windows.Forms.AnchorStyles.Left)));
            this.lblText.AutoSize = true;
            this.lblText.Location = new System.Drawing.Point(64, 26);
            this.lblText.Margin = new System.Windows.Forms.Padding(3, 0, 30, 30);
            this.lblText.MinimumSize = new System.Drawing.Size(159, 0);
            this.lblText.Name = "lblText";
            this.lblText.Size = new System.Drawing.Size(159, 13);
            this.lblText.TabIndex = 2;
            // 
            // picIcon
            // 
            this.picIcon.BackColor = System.Drawing.Color.White;
            this.picIcon.Location = new System.Drawing.Point(25, 26);
            this.picIcon.Name = "picIcon";
            this.picIcon.Size = new System.Drawing.Size(32, 32);
            this.picIcon.TabIndex = 1;
            this.picIcon.TabStop = false;
            // 
            // txtOut
            // 
            this.txtOut.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
                        | System.Windows.Forms.AnchorStyles.Right)));
            this.txtOut.Location = new System.Drawing.Point(67, 50);
            this.txtOut.Name = "txtOut";
            this.txtOut.Size = new System.Drawing.Size(159, 20);
            this.txtOut.TabIndex = 5;
            // 
            // btnOK
            // 
            this.btnOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
            this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;
            this.btnOK.Location = new System.Drawing.Point(42, 96);
            this.btnOK.Name = "btnOK";
            this.btnOK.Size = new System.Drawing.Size(88, 26);
            this.btnOK.TabIndex = 3;
            this.btnOK.Text = "OK";
            this.btnOK.UseVisualStyleBackColor = true;
            // 
            // btnCancel
            // 
            this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
            this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
            this.btnCancel.Location = new System.Drawing.Point(138, 96);
            this.btnCancel.Name = "btnCancel";
            this.btnCancel.Size = new System.Drawing.Size(88, 26);
            this.btnCancel.TabIndex = 4;
            this.btnCancel.Text = "Cancel";
            this.btnCancel.UseVisualStyleBackColor = true;
            // 
            // InputBoxForm
            // 
            this.AcceptButton = this.btnOK;
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.CancelButton = this.btnCancel;
            this.ClientSize = new System.Drawing.Size(235, 133);
            this.Controls.Add(this.btnCancel);
            this.Controls.Add(this.btnOK);
            this.Controls.Add(this.pnlWhite);
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
            this.MaximizeBox = false;
            this.MinimizeBox = false;
            this.Name = "InputBoxForm";
            this.ShowIcon = false;
            this.ShowInTaskbar = false;
            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
            this.pnlWhite.ResumeLayout(false);
            this.pnlWhite.PerformLayout();
            ((System.ComponentModel.ISupportInitialize)(this.picIcon)).EndInit();
            this.ResumeLayout(false);

        }

        #endregion

        private System.Windows.Forms.Panel pnlWhite;
        private System.Windows.Forms.PictureBox picIcon;
        private System.Windows.Forms.Label lblText;
        private System.Windows.Forms.Button btnOK;
        private System.Windows.Forms.Button btnCancel;
        private System.Windows.Forms.TextBox txtOut;
    }

4

我通常会做类似于这样的事情:

public class MyInputDialog : Form {
   public static string Execute(string Prompt) {
      using (var f = new MyInputDialog() ) {
         f.lblPrompt.Text = Prompt;
         f.ShowModal();
         return f.txtInput.Text;
      }
   }
}

如果忽略所有的错误处理,那么如果用户取消怎么办。


我一直在模态对话框上定义属性,然后从主窗体中读取它们。你的解决方案看起来更加简洁(只有一个返回参数),但它没有返回ShowModel的返回值。因此,你不知道用户是只点击了X,还是真的改变了什么。 - tofi9
没错。如果合适的话,有时我会返回 null 来取消操作,否则就会传入一个默认值到 Execute 方法中,并在取消时将其传回。 - Blorgbeard
如果有多个返回参数,您可以定义一个封装它们所有的类/结构,并返回其实例。 - Blorgbeard

3
这是我如何称呼对话框。
 var regStoreForm = new RegisterStoreForm(storeID,password);
            if (regStoreForm.ShowDialog(this) == DialogResult.OK)
            {
                storeID = regStoreForm.StoreId;
                password = regStoreForm.StorePassword;
            };
            regStoreForm.Dispose();

这是对话框的外观。
 public partial class RegisterStoreForm : Form
    {
        public int StoreId { get; set; }
        public String StorePassword { get; set; }

        public RegisterStoreForm(int storeId,string password)
        {
            InitializeComponent();
            StoreId = storeId;
            StorePassword = password;
            this.textBoxPassword.Text = StorePassword;
            this.textBoxStoreId.Text = StoreId.ToString();
        }

        private void OKbutton_Click(object sender, EventArgs e)
        {
            StoreId = Convert.ToInt16(textBoxStoreId.Text);
            StorePassword = textBoxPassword.Text;
            this.DialogResult = DialogResult.OK;
            this.Close();
        }
    }

1
我建议您使用Interaction.InputBox(需要引用Microsoft.VisualBasic):
inputValue = Interaction.InputBox("Text for the prompt", "Title of the dialog", "");

当用户按下取消按钮时,inputValue 将变为 ""

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接