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

时间:2019-02-07 18:51:43

标签: c# winforms

我坚持设计不好。

我想创建一个自定义单元格选择对话框(用户从dataGridView中选择一个单元格,然后按一下“确定”或“取消”按钮),以便获得如下所示的结果:

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

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

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

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

现在我认为这是一个糟糕的设计。我无法告诉您细节,因为它不会简短地向您解释我选择的设计,但是如果您愿意,这里是我最后一次提交的“不良设计”:github(ChooseFileFromDBForm.cs,DBFilePicker。 cs文件)

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

2 个答案:

答案 0 :(得分:1)

也许有更好的方法,但是您可以......

您可以使用Windows窗体创建自己的对话框,并为DataGridSelectedCellCollection添加“确定”,“取消”按钮和属性或成员变量。

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

以保存DataGrid的形式将此变量设置为类变量,并将其设置为null。

CellSelectionDialog csd = null

然后在DataGridView上订阅selectionChanged事件。在事件中检查您的对话框是否为空。如果是,则您不是要获取该单元格。如果不为空,则设置值

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

答案 1 :(得分:0)

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

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

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

ps -aux | grep wso2server

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

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

这就是全部工作的方式。