【问题标题】:How do i make my custom dialog in winforms?我如何在winforms中制作我的自定义对话框?
【发布时间】:2019-02-07 18:51:43
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

  • 您是否考虑过使用InputBox 并询问用户想要输入哪个单元格?
  • @Symon 嗯,这是一个想法。但我需要的正是单元格选择对话框
  • 您可以在他们单击OK 后将其添加到字符串中。就像string input = "<b>" + input + "</b>"; 一样简单
  • 我的任务是完全执行单元格选择对话框或类似的操作。那么也许有一些从CommonDialog继承的正确方法?我真的很想看到好的例子。

标签: c# winforms


【解决方案1】:

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

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

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

【讨论】:

  • 这取决于您何时需要提示用户选择单元格。当您提示用户选择单元格时,可能会提供更多上下文。
  • link 你写的所有东西我都做了,但是没有用...我把最后一段代码放在正确的地方了吗?
  • 我希望用户使用 gridview 打开该窗口,选择一行并打开按钮...然后像使用 dialogresult 一样使用它。
  • 您如何称呼该表单 (ChooseFileFromDBForm),因为它听起来好像是您想要像 CellSelectionChange 对话框一样工作的表单?
  • 抱歉没有回答,我昨天累坏了。我得到了更好更简单的解决方案。您可以通过仅创建一个表单并使用 ShowDialog 而不是 Show 调用它来获得 DialogResult。我会在几个小时内提供解决方案。
【解决方案2】:

答案是,可以使用默认表单创建自己的对话框。不需要创建任何特殊的类或类似的东西。因为Form类默认有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;

这就是一切。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    相关资源
    最近更新 更多