Как мне сделать свой собственный диалог в winforms? - PullRequest
0 голосов
/ 07 февраля 2019

Я застрял с плохим дизайном.

Я хочу создать пользовательский диалог выбора ячейки (пользователь выбирает ячейку из dataGridView, а затем нажимает кнопку OK или Отмена), чтобы я мог получить результаткак показано ниже:

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

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

Ключевым моментом здесь является то, что оператор if не будет выполняться до появления диалогового результата.

То, что я начал делать, было - создание новой формы ChooseFileFromDBForm : Form, и хорошо ... Было очень трудно определить, какие классы должны сообщать каким классам о нажатии кнопки (в этой форме есть сетка и кнопка)и т.д ...

Теперь я думаю, что это плохой дизайн.Я не могу рассказать вам подробности, так как это не будет кратким объяснением того, какой дизайн я выбрал, но если вы хотите - вот мой последний коммит "плохой дизайн" здесь: github (ChooseFileFromDBForm.cs,DBFilePicker.cs файлы)

Вопрос в том, как создать свой собственный объект DialogResult, чтобы он ожидал, пока пользователь не выберет строку / ячейку (в полученной таблице только один столбец) и нажмет "Кнопки «ОК» или «Отмена»?

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Ответ в том, что можно создать собственный диалог с формой по умолчанию.Не нужно создавать специальные классы или что-то в этом роде.Поскольку класс Form по умолчанию имеет метод ShowDialog.

Чтобы получить DialogResult как OK или Отмена или что-то в этом роде, установите "DialogResult" в "Поведении" вашей кнопки в форме на OK или Отменаили что угодно.Если ничего не установлено, ваш 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;

Вот как все это работает.

0 голосов
/ 07 февраля 2019

Возможно, есть лучший способ, но вы можете ......

Вы можете создать свой собственный диалог, используя формы Windows, добавить кнопку OK, Отмена и переменную свойства или члена для 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...