数据在从 Form2 发送回 Form1 之前验证

Posted

技术标签:

【中文标题】数据在从 Form2 发送回 Form1 之前验证【英文标题】:Data validate before send back from Form2 to Form1 【发布时间】:2022-01-14 23:38:47 【问题描述】:

我有 2 个表格,Form1 和 Form2。

假设在 Form1 中,它在 ListBox 中显示一个水果名称列表和一个 ADD 按钮。在Form2中,一个TextBox输入水果名称和OK按钮。

当点击添加按钮时,我能够从 Form1 调用 Form2,并在点击 OK 按钮时将数据从 Form2 传递到 Form1。 (确定按钮 > DialogResult 属性设置为“确定”)

但有一个问题...当 Form2 中的 TextBox 为空并单击“确定”按钮时,它会显示消息框,然后关闭 Form2 并在 Form1 中继续。

虽然点击了确定按钮,但如果 TextBox 为空,如何让 Form2 保持打开状态?

下面是示例代码:

public partial class Form1 : Form

    private void btnAdd_Click(object sender, EventArgs e)
    
        using (Form2 f2 = new Form2())
        
            if (f2.ShowDialog() == DialogResult.OK)
            
                string newFruit = f2.fruit;
                //add newFruit value into Form1 ListBox
            
        
    


public partial class Form2 : Form
        
    public string fruit  get; 
    private void btnOK_Click(object sender, EventArgs e)
    
        if (txtFruitName.Text != "")
        
            fruit = txtFruitName.Text;
        
        else
        
            MessageBox.Show("Fruit name cannot be empty!");
        
    

【问题讨论】:

btnOkForm2 上的DialogResult 属性是否设置为None 以外的任何值? 我只将Form2的btnOK的DialogResult设置为“OK” 必须有其他东西关闭form2。在我的小测试中……您的要求……“当 Form2 中的 TextBox 为空并单击 OK 按钮时,它会显示消息框然后关闭 Form2”……在我的测试中不会发生。无论文本框是否有文本,Form2 都将保持打开状态。正如在前面的评论中已经指出的那样……发布的代码似乎没有将表单 DialogResult 设置为 OK,也没有关闭 form2。最后,不清楚fruit = txtFruitName.Text; 行代码如何不产生编译时错误……? …它似乎是一个只读变量,除非我遗漏了什么。 【参考方案1】:

如果您将表单中按钮的DialogResult 设置为None 以外的其他值,则该按钮将关闭表单并自动更新其DialogResult。要控制关闭行为,您必须自己实现逻辑 - 在这种情况下这真的没什么大不了的。只需将以下行添加到您的Form2 按钮代码中,并将属性中按钮的DialogResult 切换为None

private void button1_Click(object sender, EventArgs e)
    
      if (txtFruitName.Text != "")
      
        fruit = txtFruitName.Text;
        DialogResult = DialogResult.OK;
        Close();
      
      else
      
        MessageBox.Show("Fruit name cannot be empty!");
      

    

【讨论】:

【参考方案2】:

我会订阅FormClosing 事件,这是进行验证的常规做法。

public partial class Form2 : Form

    public string fruit  get; 

    Form2()
    
       InitializeComponent();
       FormClosing += form2_FormClosing;
    

    private void btnOK_Click(object sender, EventArgs e)
    
        if (txtFruitName.Text != "")
        
            fruit = txtFruitName.Text;
            Close();
        
        else
        
            MessageBox.Show("Fruit name cannot be empty!");
        
    

    private void form2_FormClosing(object sender, FormClosingEventArgs e)
    
        if (string.IsNullOrWhiteSpace(txtFruitName?.Text))
        
           e.Cancel = true;
        
     

【讨论】:

以上是关于数据在从 Form2 发送回 Form1 之前验证的主要内容,如果未能解决你的问题,请参考以下文章

C# form2如何用form1中的数据

c# FORM1怎么连接FORM2?

使用 php/javascript 或 jquery 提交 form2 时阻止其他 form1 提交

C# winform 多form传递数据问题

delphi 如何将form2的值传递form1

插入行后从 form2 刷新 form1 gridview