【问题标题】:How to make a own input dialog?如何制作自己的输入对话框?
【发布时间】:2016-01-13 00:20:22
【问题描述】:

所以问题来了,我想制作一个输入对话框,当单击主框架中的按钮时,它会触发输入对话框。我们可以在对话框中输入文字,然后在输入对话框中点击“添加”按钮,这样主框架上的文本框就可以显示我刚刚输入的字符串了。但是,我目前面临这样做的困难。因为对话框和主框架是两个模块,这意味着当我点击主框架上的按钮触发输入对话框时,它不能等到我输入字符串,并且按钮事件处理程序完成它们的工作,所以它永远无法阅读我的输入。无论如何,这是我的代码:

 /* some code */

 // add first name and last name
 private void addButton_Click(object sender, EventArgs e)
 {
    Add add = new Add();   // declare a Add object
    add.Visible = true;    // show the Add frame
    if (add.isOK)
    {
        firstName = add.getFirstName();
        lastName = add.getLastName();
        textArea.Text = "First Name: " + firstName + "\r\n";    // textArea is a multiple line textbox
        textArea.Text += "Last Name: " + lastName;
    }
}

/* some code */

上方是触发添加对象(输入对话框)的主框架上的添加按钮。这是我的 Add 类:

namespace DatabaseToAPI
{
    public partial class Add : Form
    {
        private string firstName;
        private string lastName;
        public bool isOK = false;  // to check if name is provided

        public Add()
        {
            InitializeComponent();
            this.Visible = false;  // only become visible when the main form's Add button is clicked
        }

        public string getFirstName()
        {
            return firstName;  // return the first name
        }

        public string getLastName()
        {
            return lastName;   // return the last name
        }

        // Add button event handler
        private void addButton_Click(object sender, EventArgs e)
        {
            if (firstNameBox.Text != "" && lastNameBox.Text != "")   // if name is provided
            {
                firstName = firstNameBox.Text;
                lastName = lastNameBox.Text;
                isOK = true;    // name has provided
                this.Close();
            }
            else
            {
                MessageBox.Show("Please provide both first name and last name", "Sorry", MessageBoxButtons.OK);
            }
        }

        private void cancelButton_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
 }

如您所见,Add 类基本上就像一个输入对话框,当在主窗体上单击 Add 按钮时,会出现 Add 窗体。唯一的问题是主框架上的输入对话框触发按钮的事件处理程序不能等到我输入名称并单击按钮表示我完成,它只是简单地通过代码而不等待 Add 类完成他们工作。我怎样才能让主窗体知道我何时添加名称以便他们可以阅读我输入的文本?

【问题讨论】:

  • 文本框中是否出现First Name: & Last Name:?还是只是空白?
  • 似乎有问题的是你有两个 addButton_Click()...
  • 哦,我明白了 - 你实际上并没有将 Add 显示为对话框,所以当 if (add.isOK) 执行 isOK 时是 false
  • Java 方法命名约定是什么? :-p
  • 您必须将 add.Visible = true; 替换为 add.ShowDialog();

标签: c# winforms


【解决方案1】:

这是关于对话框的一般模式:

private void addButton_Click(object sender, EventArgs e)
{
   using(var add = new Add()) // so that it will be disposed after usage
   {
       if (add.ShowDialog(this) == DialogResult.OK)
       {
           firstName = add.getFirstName();
           lastName = add.getLastName();
           textArea.Text = "First Name: " + firstName + "\r\n";
           textArea.Text += "Last Name: " + lastName;
       }
   }
}

在您的对话框代码中,您应该删除 isOK 并在相关按钮事件中使用 DialogResult = DialogResult.OK / DialogResult.Cancel。

【讨论】:

    【解决方案2】:

    这就是在C# 中调用模态对话框的方式

    Add dlg = new Add();
    if(dlg.ShowDialog() == DialogResult.OK)
    {
        lastName = dlg.LastName;
        firstName = dlg.FirstName;
    }
    

    为此,您需要在Add 表单关闭时返回DialogResult.OK。所以以你需要的形式

    public partial class Add : Form
    {
        public Add()
        {
            InitializeComponent();
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
            this.DialogResult=DialogResult.OK;
        }
    
        private void button2_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    
        public string FirstName { get { return textBox1.Text; } }
        public string LastName { get { return textBox2.Text; } }
    }
    

    【讨论】:

      【解决方案3】:

      好的,感谢回答的人,我成功了。我们基本上只是将表单视为一个对话框。代码如下:

      // add first name and last name
      private void addButton_Click(object sender, EventArgs e)
      {
          Add add = new Add();
          add.ShowDialog(this);
      
          try {
              if (add.DialogResult == DialogResult.OK)
              {
                  firstName = add.getFirstName();
                  lastName = add.getLastName();
                  textArea.Text = "First Name: " + firstName + "\r\n";
                  textArea.Text += "Last Name: " + lastName;
              }
          } 
          catch
          {
      
          }
      }
      

      这是 Add 类:

      namespace DatabaseToAPI
      {
          public partial class Add : Form
          {
              private string firstName;
              private string lastName;
      
              public Add()
              {
                  InitializeComponent();
                  this.Visible = false;
              }
      
              public string getFirstName()
              {
                  return firstName;
              }
      
              public string getLastName()
              {
                  return lastName;
              }
      
              private void addButton_Click(object sender, EventArgs e)
              {
                   if (firstNameBox.Text != "" && lastNameBox.Text != "")
                  {
                      firstName = firstNameBox.Text;
                      lastName = lastNameBox.Text;
                      this.DialogResult = DialogResult.OK;
                  }
                  else
                  {
                      MessageBox.Show("Please provide both first name and last name", "Sorry", MessageBoxButtons.OK);
                  }
              }
      
              private void cancelButton_Click(object sender, EventArgs e)
              {
                  this.DialogResult = DialogResult.Cancel;
              }
          }
      }
      

      【讨论】:

      • 私有变量 firstNamelastName 是多余的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-05
      • 1970-01-01
      • 2015-05-03
      • 1970-01-01
      • 1970-01-01
      • 2016-02-17
      • 2012-02-28
      相关资源
      最近更新 更多