Изменить видимое состояние DataGridView только с учетом его имени - PullRequest
0 голосов
/ 10 мая 2019

У меня есть приложение формы, в котором должны отображаться несколько объектов DataGridView (но не сразу). Они должны быть созданы друг над другом, и тогда должна быть возможность переключения отображаемого DataGridView с помощью ComboBox. У меня есть функция, которая должна создавать новый DataGridView каждый раз, когда он вызывается, а затем добавляет имя в ComboBox:

private void readCSV(string DBname)
{
    DataGridView tagDBname = new DataGridView();
    tagDBname.Location = new System.Drawing.Point(24, 260);
    tagDBname.Name = DBname;
    tagDBname.Size = new System.Drawing.Size(551, 217);
    tagDBname.TabIndex = 6;

    tagDBname.Columns.Add("Column1", "Col1");
    tagDBname.Columns.Add("Column2", "Col2");

    tagDBname.Visible = false;

    comboBoxTag.Items.Add(DBname);
}

Тогда я бы хотел изменить состояние видимости DataGridView, учитывая выбранное имя из ComboBox. Это должно быть сделано в функции, вызываемой при изменении индекса:

private void comboBoxTag_SelectedIndexChanged(object sender, EventArgs e)
{
    // Get the name of the DataGridView which should be visible:
    string selectedTagDB = comboBoxTagDatabases.SelectedItem.ToString();
    DataGridView tagDatabase = ? // Here the DataGridView should be selected given the name "selectedTagDB"

    tagDatabase.Visible = true;
}

Выше я не знаю, как назначить DataGridView только по его имени. Любая помощь будет принята с благодарностью - даже если это означает, что выбранный подход не соответствует тому, чего я пытаюсь достичь. Если на этот вопрос ответят в другом месте, не стесняйтесь направлять меня в правильном направлении:)

Ответы [ 2 ]

4 голосов
/ 10 мая 2019

Я бы сохранял виды сетки в словаре, используя имя БД в качестве ключа;

private readonly Dictionary<string, DataGridView> _tagDBs =
    new Dictionary<string, DataGridView>();

private void readCSV(string DBname)
{
    DataGridView tagDBname = new DataGridView();

    // Add the gridview to the dictionary.
    _tagDBs.Add(DBname, tagDBname);

    tagDBname.Name = DBname;
    tagDBname.Location = new System.Drawing.Point(24, 260);
    tagDBname.Size = new System.Drawing.Size(551, 217);
    tagDBname.TabIndex = 6;

    tagDBname.Columns.Add("Column1", "Col1");
    tagDBname.Columns.Add("Column2", "Col2");

    tagDBname.Visible = false;

    this.Controls.Add(tagDBname); // Add the gridview to the form ot to a control.
    comboBoxTag.Items.Add(DBname);
}

private void comboBoxTag_SelectedIndexChanged(object sender, EventArgs e)
{
    // Get the name of the DataGridView which should be visible:
    string selectedTagDB = comboBoxTagDatabases.SelectedItem.ToString();

    foreach (DataGridView dgv in _tagDBs.Values) {
        dgv.Visible = dgv.Name == selectedTagDB; // Hide all gridviews except the selected one.
    }
}

Если вам нужно что-то сделать с выбранным видом сетки, вы можете получить его с помощью:

if (_tagDBs.TryGetValue(selectedTagDB, out DataGridView tagDatabase)) {
    // do something with tagDatabase.
}

Примечание. Необходимо добавить вид сетки в форму или элемент управления контейнера в форме.Например,

this.Controls.Add(tagDBname);
2 голосов
/ 10 мая 2019

Вы можете просмотреть все DataGridView формы, чтобы отобразить ожидаемый, используя его имя, при этом скрывая остальные.

Это решение не красиво, но работает

private void ShowOneDataGridViewAndHideOthers(string name)
{
    foreach (var DGV in this.Controls.OfType<DataGridView>())
    {
        DGV.Visible = DGV.Name == name;
    }
}

И назовите это так:

private void comboBoxTag_SelectedIndexChanged(object sender, EventArgs e)
{
    // Get the name of the DataGridView which should be visible:
    string selectedTagDB = comboBoxTagDatabases.SelectedItem.ToString();
    ShowOneDataGridViewAndHideOthers(selectedTagDB);
}

Метод можно сделать более общим:

private void ShowOneControlAndHideOthers<T>(string name, Control controls) where T : Control
{
    foreach (var control in controls.Controls.OfType<T>())
    {
        control.Visible = control.Name == name;
    }
}

private void comboBoxTag_SelectedIndexChanged(object sender, EventArgs e)
{
    // Get the name of the DataGridView which should be visible:
    string selectedTagDB = comboBoxTagDatabases.SelectedItem.ToString();
    ShowOneControlAndHideOthers<DataGridView>(selectedTagDB, this);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...