Добавление временных данных в список и привязка их к DataGridView Winform - PullRequest
0 голосов
/ 18 февраля 2012

Я хочу поместить временные данные в общий список и связать их с представлением данных.
Тем не менее, я могу поместить только 1 строку в таблицу данных, я хочу ввести несколько строк, как в базе данных.

Вот что я пробовал, подскажите пожалуйста как это исправить. спасибо:))

MyClass
{
   private List<object> _list = new List<object>();;

   public MyClass()
   {
   }

   protected void OnClickButton(object sender, args e)
   {
     _list.Add(new { Name = textBoxName.Text, Gender = genderComboBox.Text });
     dataGridView1.DataSource = _list;
   }
}

Большое спасибо! Я действительно переполнен этой проблемой.

Ответы [ 3 ]

2 голосов
/ 18 февраля 2012

Вы можете использовать BindingList<object> вместо List<object>, например:

BindingList<object> bList = new BindingList<object>();

public MyClass()
{
}

private void button1_Click(object sender, EventArgs e)
{
    bList.Add(new { Name = "Foo", Gender = "Bar" });
    dataGridView1.DataSource = bList;
}

Проблема с вашим кодом заключается в том, что вы добавляете элемент в _list, а затем передаете список какисточник данных сетки.В первый раз все отлично работает.В следующий раз это не сработает, потому что свойство DataGridView.DataSource внутренне выполняет проверку, которая проверяет, равен ли переданный объект (или лучше равен ссылке) текущему, и в случае, если он ничего не делает.

BindingList<T> работает, потому что он выставляет события (используемые сеткой), сообщая об изменении списка, поэтому в принципе вы также можете избежать передачи его в DataSource каждый раз, кроме первого.


В качестве примечания я предлагаю вам использовать определенный класс (как показано в @ Alex answer ) вместо того, чтобы помещать анонимный класс в список object.

Например, используя пользовательский класс, такой как Person, вы можете передать пустой BindingList<Person> в grid.DataSource, а затем добавить другие Person объекты без проблем.

Вместо этого вы не можете передать пустую BindingList<object> в grid.DataSource, потому что это приводит к сетке без столбцов и, следовательно, после того, как вы не можете добавить какие-либо элементы, имеющие общедоступные свойства (потому что публичные свойства превращаются вколонны).Таким образом, вам нужно передать BindingList<object> хотя бы с одним определенным объектом, чтобы сетка могла понять, какими будут столбцы, и создать их.

1 голос
/ 18 февраля 2012

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

public class Person
{
    public String Name { get; set; }
    public String Gender { get; set; }
}

// Your control
private List<Person> _persons = new List<Person>();

// Click Event
dataGridView1.DataSource = null;
_persons.Add(new Person() { Name = "Test", Gender = "Male" });
dataGridView1.DataSource = _persons;

Это обновляет сетку данных с текущими данными в вашем списке.

Использование BindingList<T>, похоже, является правильным способом.(Спасибо @digEmAll)

private BindingList<Person> _persons = new BindingList<Person>();

// Load Event
dataGridView1.DataSource = _persons;

private void button1_Click(object sender, EventArgs e)
{
    _persons.Add(new Person() { Name = "Test", Gender = "Male" });
}
0 голосов
/ 18 февраля 2012

Используйте ObservableCollection<T> вместо списка

...