Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在winforms中创建自定义对话框?_C#_Winforms - Fatal编程技术网

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

C# 如何在winforms中创建自定义对话框?,c#,winforms,C#,Winforms,我一直坚持一个糟糕的设计 我想创建一个自定义单元格选择对话框(用户从dataGridView中选择一个单元格,然后按下“确定”或“取消”)以便获得如下结果: public string GetFile() { DialogResult dialogResult = _open.ShowDialog(); if (dialogResult == DialogResult.OK) return _open.FileName; else ret

我一直坚持一个糟糕的设计

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

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

    if (dialogResult == DialogResult.OK)
        return _open.FileName;
    else
        return null;
}
这里的关键是,if语句在dialogresult出现之前不会执行

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

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


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

也许有更好的办法,但你可以

您可以使用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();

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

为了将DialogResult设置为OK或Cancel之类,请将表单中按钮“行为”中的“DialogResult”设置为OK或Cancel或任何您想要的选项。如果未设置任何内容,则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;

这就是它的工作原理。

你有没有考虑过使用
输入框
,询问用户想要输入什么单元格?@Symon嗯,这是个好主意。但我需要的正是单元格选择对话框,您可以在他们单击
OK
后将其添加到字符串中。简单到
stringinput=“”+input+”我的任务是精确地执行单元格选择对话框或类似的操作。那么,也许有一些正确的方法来继承CommonDialog?我真的很想看到好的例子。这取决于何时需要提示用户选择单元格。当提示用户选择单元格时,可能会提供更多上下文。我做了你写的每件事,但它不起作用。。。我把最后一段代码放在正确的位置了吗?我想让用户用gridview打开那个窗口,选择一行并打开按钮。。。然后使用类似dialogresult的功能..您如何调用该表单(ChooseFileFromDBForm),因为它听起来似乎就是您想要表现为CellSelectionChange对话框的表单?很抱歉没有回答,我昨天筋疲力尽了。我得到了更好更简单的解决方案。您可以通过创建一个表单并使用ShowDialog而不是Show调用它来获得DialogResult。我将在几个小时内提供解决方案。