如何在winforms中创建自定义对话框?

问题描述 投票:2回答:2

我坚持一个糟糕的设计。

我想创建一个自定义单元格选择对话框(用户从dataGridView中选择一个单元格然后按下确定或取消按钮),这样我就可以得到如下结果:

public string GetFile()
{
    DialogResult dialogResult = _open.ShowDialog();

    if (dialogResult == DialogResult.OK)
        return _open.FileName;
    else
        return null;
}

这里的关键是if语句在dialogresult出现之前不会执行。

我开始做的是 - 创建一个新的表单ChooseFileFromDBForm : Form,以及...很难弄清楚哪些类应该通知哪些类关于按钮点击(有一个gridview和那个表单中的按钮)等...

现在我认为这是一个糟糕的设计。我不能告诉你细节,因为它不会简单地解释你我选择了什么样的设计,但是如果你想要的话 - 我的最后一次提交是“糟糕的设计”:github(ChooseFileFromDBForm.cs,DBFilePicker.cs文件)

问题是 - 我如何创建自己的DialogResult事物 - 等到用户选择行/单元格(结果表中只有一列)并按下“确定”或“取消”按钮?

c# winforms
2个回答
1
投票

可能有更好的方法,但你可以......

您可以使用Windows窗体创建自己的对话框,并为DataGridSelectedCellCollection添加一个OK,Cancel按钮和一个属性或成员变量。

public partial class CellSelectionDialog : Form
{
    public DataGridViewSelectedCellCollection cells { get; set; }
    public CellSelectionDialog()
    {
        InitializeComponent();
    }
}

将其设置为包含DataGrid的表单中的类变量,并将其设置为null。

CellSelectionDialog csd = null

然后在您的DataGridView上订阅selectionChanged事件。在事件中检查您的Dialog是否为空。如果是,那么你不打算获得细胞。如果它不为null,则设置该值

if (csd != null)
{
    csd.cells = dgvGrid.SelectedCells;
    csd.BringToFront();
}

添加一个事件处理程序来处理使用DataGridView关闭表单上的表单

private void CellSelectionDialog_FormClosing(object sender, FormClosingEventArgs e)
{
    if (csd.DialogResult == DialogResult.OK)
    {
        //Do something with csd.cells
        MessageBox.Show(csd.cells[0].Value.ToString());
        //set the form to null;
        csd = null
    }
}

你可以将对话框称为

csd = new CellSelectionDialog();
csd.FormClosing += CellSelectionDialog_FormClosing;
csd.Show();

0
投票

答案是,可以使用默认表单创建自己的对话框。一个人不需要创建任何特殊的类或类似的东西。因为Form类默认具有ShowDialog方法。

为了使DialogResult为OK或Cancel或类似的东西,将表单中按钮的“行为”中的“DialogResult”设置为“确定”或“取消”或任何您想要的内容。如果未设置任何内容,则DialogResult将始终为None。

我在“自定义对话框”表单中有一个公共属性(它仍然只是一个表单),它返回所选行的值:

public string SelectedFileName
{
   get
   {
       if (IsSelected)
           return filesDBdataGridView.SelectedCells[0].Value.ToString();
       return null;
   }
}

因此,如果我单击其DialogResult设置为OK的按钮,我将获得该属性的值:

_chooseForm.ShowDialog();
if (_chooseForm.DialogResult == DialogResult.OK)
   return _chooseForm.SelectedFileName;
else
   return null;

这就是它的运作方式。

© www.soinside.com 2019 - 2024. All rights reserved.