Вы можете установить 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 = "";
}
//(...)