DataGridView не загружает данные программно - PullRequest
0 голосов
/ 17 января 2019

Я работаю над приложением Windows, где я получаю ввод из TextBox и добавляю его в DataGridView, когда пользователь нажимает кнопку (Add).

enter image description here

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

Код:

private void btnAddInput_Click(object sender, EventArgs e)
{
    if (Data == null)
        Data = new List<Inputs>();

    if (!string.IsNullOrWhiteSpace(txtInput.Text))
    {
        Data.Insert(Data.Count, new Inputs()
        {
            Name = txtInput.Text,
            Value = string.Empty
        });
    }
    else
    {
        MessageBox.Show("Please enter parameter value", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }

    txtInput.Text = "";
    gridViewInputs.DataSource = Data;
}

Я не уверен, что приводит к тому, что запись не добавляется в сетку при втором нажатии кнопки добавления.

1 Ответ

0 голосов
/ 17 января 2019

Вы можете установить DataGridView.DataSource на null перед установкой нового.
Это приведет к тому, что DataGridView обновит свое содержимое новыми данными в источнике List<Inputs>:
базовый DataGridViewDataConnection сбрасывается только в том случае, если задание DataSource отличается от текущего или установлено на ноль.

Обратите внимание, что при сбросе DataSource событие RowsRemoved вызывается несколько раз (один раз для каждой удаляемой строки).

Я предлагаю изменить List на BindingList , потому что любое изменение в Списке будет отражено автоматически и потому что оно позволит удалять строки из DataGridView, если / когда это необходимо: используя List<T>, поскольку DataSource не позволит удалить строку.

BindingList<Inputs> InputData = new BindingList<Inputs>();

Вы всегда можете установить свойства AllowUserToDeleteRows и AllowUserToAddRows равными false, если вы не хотите, чтобы ваши пользователи вмешивались в содержимое сетки.

Например:

public class Inputs
{
    public string Name { get; set; }
    public string Value { get; set; }
}

internal BindingList<Inputs> InputData = new BindingList<Inputs>();

private void Form1_Load(object sender, EventArgs e)
{
    dataGridView1.DataSource = InputData;
}

private void btnAddInput_Click(object sender, EventArgs e)
{
    string textValue = txtInput.Text.Trim();
    if (!string.IsNullOrEmpty(textValue))
    {
        InputData.Add(new Inputs() {
            Name = textValue,
            Value = "[Whatever this is]"
        });
        txtInput.Text = "";
    }
    else
    {
        MessageBox.Show("Not a valid value");
    }
}

Если вы хотите продолжать использовать List<T>, добавьте код, необходимый для сброса DataGridView.DataSource:

private void btnAddInput_Click(object sender, EventArgs e)
{
    if (!string.IsNullOrEmpty(textValue))
    {
        //(...)
        dataGridView1.DataSource = null;
        dataGridView1.DataSource = InputData;
        txtInput.Text = "";
    }
    //(...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...