2011-02-05 2 views
3

dataGridView1 제네릭 목록에 연결하고 싶습니다. 이렇게하려면 아래 코드를 사용하십시오.dataGridView1 내 일반 목록에 연결 하시겠습니까?

dataGridView1.DataSource = 목록;

(목록 정적)

하지만 일반적인 dataGridView1도 업데이트받을 목록을 업데이트 할 때마다 어떻게해야합니까?

+1

내가 당신을 이해하기 위해 노력하고있어,하지만 귀하의 질문에 적절한 영어로 정말 없습니다. 목록의 데이터가 업데이트 될 때 GridView를 업데이트하지 않으려면 GridView를 바인딩하는 데이터 및 업데이트를 위해 목록을 사용하지 마십시오. – TheGeekYouNeed

+0

이 작업을 수행 하시겠습니까? dataGridView1.DataSource = null; dataGridView1.DataSource = _List; –

+0

예제가 추가되었습니다 –

답변

2

대신 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); 
     } 
    } 
} 
+0

정적 목록 lst = 새 목록 (); dataGridView1.DataSource = lst; lst.add ("AA", "BB", "CC"); lst.add ("AAA", "BBB", "CCC"); dataGridView1 또한 변경 사항을 적용 ... 어떻게? –

+0

@ mah_85'static BindingList lst = new BindingList ();' –

+0

그러나 여기서도 '정적'에 반대하는 것이 좋습니다. 개별 행에 대한 개별 속성 변경은 여전히'INotifyPropertyChanged'를 구현해야합니다. –

관련 문제