dataGridView1 제네릭 목록에 연결하고 싶습니다. 이렇게하려면 아래 코드를 사용하십시오.dataGridView1 내 일반 목록에 연결 하시겠습니까?
dataGridView1.DataSource = 목록;
(목록 정적)
하지만 일반적인 dataGridView1도 업데이트받을 목록을 업데이트 할 때마다 어떻게해야합니까?
dataGridView1 제네릭 목록에 연결하고 싶습니다. 이렇게하려면 아래 코드를 사용하십시오.dataGridView1 내 일반 목록에 연결 하시겠습니까?
dataGridView1.DataSource = 목록;
(목록 정적)
하지만 일반적인 dataGridView1도 업데이트받을 목록을 업데이트 할 때마다 어떻게해야합니까?
대신 BindingList<T>
을 사용하십시오. 이것은 뚜껑 변경 알림 (추가, 제거 등)을 제공합니다. 또한 유형 변경이 INotifyPropertyChanged
을 올바르게 구현하는 경우에만 속성 수준 변경을위한 행 수준 알림을 제공합니다. 그래서 그것을 구현하십시오.
static
필드를 의미하는 경우 "목록이 정적"입니다. 여러 스레드를 사용하면 문제가 발생할 수 있습니다. 저는 개인적으로 그런 식으로하지 않을 것입니다. 그러나 그것은 그 질문과 관련이 없습니다.
예 :
using System;
using System.ComponentModel;
using System.Windows.Forms;
static class Program
{
class Foo
{
public int A { get; set; }
public string B { get; set; }
}
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
using (var form = new Form())
using (var grid = new DataGridView { Dock = DockStyle.Fill })
using (var add = new Button { Dock = DockStyle.Bottom, Text = "add" })
using (var remove = new Button { Dock = DockStyle.Top, Text = "remove" })
{
form.Controls.Add(grid);
form.Controls.Add(add);
form.Controls.Add(remove);
var lst = new BindingList<Foo>();
var rnd = new Random();
add.Click += delegate
{
lst.Add(new Foo { A = rnd.Next(1, 6), B = "new" });
};
remove.Click += delegate
{
int index = 0;
foreach (var row in lst)
{ // just to illustrate removing a row by predicate
if (row.A == 2) { lst.RemoveAt(index); break; }
index++;
}
};
grid.DataSource = lst;
Application.Run(form);
}
}
}
정적 목록
@ mah_85'static BindingList
그러나 여기서도 '정적'에 반대하는 것이 좋습니다. 개별 행에 대한 개별 속성 변경은 여전히'INotifyPropertyChanged'를 구현해야합니다. –
내가 당신을 이해하기 위해 노력하고있어,하지만 귀하의 질문에 적절한 영어로 정말 없습니다. 목록의 데이터가 업데이트 될 때 GridView를 업데이트하지 않으려면 GridView를 바인딩하는 데이터 및 업데이트를 위해 목록을 사용하지 마십시오. – TheGeekYouNeed
이 작업을 수행 하시겠습니까? dataGridView1.DataSource = null; dataGridView1.DataSource = _List; –
예제가 추가되었습니다 –