首页 > 解决方案 > 我如何在winforms中制作我的自定义对话框?

问题描述

我坚持一个糟糕的设计。

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

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

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

这里的关键是,直到出现 dialogresult 才会执行 if 语句。

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

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

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

标签: c#winforms

解决方案


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

您可以使用 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 是否为空。如果是,那么您不希望获得该单元格。如果不为空,则设置该值

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();

推荐阅读