이 솔루션은 dgv를 채우는 데 도움이되지만 익명 유형이 변경 불가능하기 때문에 이러한 그리드는 편집 할 수 없지만 그렇지 않으면 양방향 바인딩에 도움이 될 것이라고 생각하지 않습니다.
List<int> values = GetValues();
var dataGridView = new DataGridView();
dataGridView.DataSource = values.Select(el => new { Value = el }).ToList();
래퍼 클래스를 사용하면 셀을 편집 할 수 있지만 변경 사항이 원래 컬렉션에 반영되지 않습니다.
public class Wrapper<T>
{
public T Value { get; set; }
public Wrapper(T value) => Value = value;
}
...
dataGridView.DataSource = new BindingList<Wrapper<int>>(values.Select(value => new Wrapper<int>(value)).ToList());
그렇다면 어떻게 작동합니까?
양방향 데이터 바인딩은 데이터 소스의 변경 알림을 기반으로 작동합니다. 여기에 데이터 소스는 List<int>
, 어느 쪽 List<T>
도 int
따라서 양방향 데이터 바인딩이 여기에 이해가되지 않습니다, 변경 통지를 발생시킵니다.
BindingList<int>
with의 양방향 데이터 바인딩을 구현하려는 경우 다음 작업을 수행 DataGridView
할 수 있습니다.
BindingList<int> originalBindingList;
private void Form1_Load(object sender, EventArgs e)
{
originalBindingList = new BindingList<int>(new List<int> { 1, 2, 3 });
dataGridView1.DataSource = new ListDataSource<int>(originalBindingList);
}
그때:
DataGridView
값이 Value
포함 된 열과 행 이 표시 originalBindingList
됩니다.DataGridView
하면 값 originalBindingList
이 변경됩니다.originalBindingList
코드에서 값을 변경하면 값 DataGridView
이 새로 고쳐집니다.다음은 ListDataSource입니다.
public class ListDataSource<T> : BindingSource
{
public ListDataSource(BindingList<T> original)
{
for (int i = 0; i < original.Count; i++)
{
this.Add(new Item(original, i));
}
original.ListChanged += (obj, args) =>
this.OnListChanged(new ListChangedEventArgs(
args.ListChangedType, args.NewIndex));
}
private class Item : INotifyPropertyChanged
{
IList<T> source;
int index;
public Item(IList<T> source, int index)
{
this.source = source;
this.index = index;
}
public T Value
{
get { return source[index]; }
set
{
source[index] = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Value"));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다