消息框关闭表格不规律

时间:2014-09-26 16:46:46

标签: c# winforms forms messagebox dialogresult

我使用一个消息框来确保用户是否想要从gridview中删除一行但是无论他们给出什么答案,它都会关闭表单并返回到form1

这是加载viewTransactions表单的地方,此代码在Form1中

 private void btnViewTrans_Click(object sender, EventArgs e)
 {
    viewTransactions = new View_Transactions(newList);
    if (viewTransactions.ShowDialog() == DialogResult.OK)
    {
       newList.Equals(viewTransactions.getList());
    }

 }   

这是messageBox在viewTransaction表单中显示的位置

    ///////////////////////////////
    //Remove an item from the list
    private void button3_Click(object sender, EventArgs e)
    {
        DialogResult result = new DialogResult();
        result = MessageBox.Show("Are you sure you want to delete this element?", "Confirmation", MessageBoxButtons.YesNoCancel);
        if (result == DialogResult.Yes)
        {
            foreach (DataGridViewRow item in this.dataGridView1.SelectedRows)
            {
                tmpList.remove(item.Index);//remove item from tmpList used to update the passed in list                    
                dataGridView1.Rows.RemoveAt(item.Index);//remove the item from the dataGrid
            }
        }
    }

在使用消息框显示警告之前,我对代码没有任何问题。我相信DialogResult正被传递给另一个ShowDialog,这就是为什么它会关闭我的表格。

2 个答案:

答案 0 :(得分:0)

如果您的button3按钮的属性DialogResult设置为与DialogResult.None不同,则会发生此行为。 (查看属性窗口)

当您单击一个按钮时,DialogResult属性将传递给表单的DialogResult属性,如果它与None不同,则表单将被关闭。
这就是Modal表单如何与调用代码通信用户做出的选择。

通常这个 bug 是由于Copy/Paste另一个按钮控件的结果而发生的,该控件是通过Property Designer正确设置的,以便返回DialogResult。 顺便说一下,不需要初始化new DialogResult的代码。

所以我建议将button3.DialogResult属性设置为DialogResult.None,然后,如果单击button3导致用户确认将Form.DialogResult属性直接设置为是。

private void button3_Click(object sender, EventArgs e)
{
    DialogResult result = MessageBox.Show("Are you sure you want to delete this element?", "Confirmation", MessageBoxButtons.YesNoCancel);
    if (result == DialogResult.Yes)
    {
        foreach (DataGridViewRow item in this.dataGridView1.SelectedRows)
        {
            tmpList.remove(item.Index);//remove item from tmpList used to update the passed in list                    
            dataGridView1.Rows.RemoveAt(item.Index);//remove the item from the dataGrid
        }
        this.DialogResult = DialogResult.Yes;
    }
}

答案 1 :(得分:0)

我通过添加this.dialogResult = dilaogResult.None来解决它; 一旦调用button3_Click,base.DialogResult就会因某种原因而取消

史蒂夫在我尝试你的生产线时它仍会关闭,但感谢告诉我如何看待我的想法

private void button3_Click(object sender, EventArgs e)
    {
        this.DialogResult = DialogResult.None;
        DialogResult result = new DialogResult();
        result = MessageBox.Show("Are you sure you want to delete this element?", "Confirmation", MessageBoxButtons.YesNo);
        if (result == DialogResult.Yes)
        {
            foreach (DataGridViewRow item in this.dataGridView1.SelectedRows)
            {
                tmpList.remove(item.Index);//remove item from tmpList used to update the passed in list                    
                dataGridView1.Rows.RemoveAt(item.Index);//remove the item from the dataGrid
            }
        }

    }