[英]How to bind nested list to datagridview in winforms
我正在以 windows 形式創建應用程序。 下面提到的是我要綁定到 DataGridView 的列表的結構。 我有主列表(學生),在主列表中,我有要綁定到 DataGrid 視圖的子列表(書)。 因此,主列表將有 Id(int)、Name(string) 和 lstBk(list 這是子列表)。
public class Student
{
public int ID { get; set; }
public string Name { get; set; }
public List<Book> lstBk { get; set; }
}
public class Book
{
public int ID { get; set; }
public string Name{ get; set; }
}
每當我將列表綁定到數據網格視圖時,我只會在網格視圖行中獲取 Id 和 Name 而不是 lstBk。 如何在數據網格視圖中獲取 ID 和名稱后的 lstBk?
List<Book> lst = new List<Book>();
lst.Add(new Book() { ID= 1, Name ="Book 1" } );
lst.Add(new Book() { ID = 2, Name = "Book 2" });
lst.Add(new Book() { ID = 3, Name = "Book 3" });
List<Student> lstUD = new List<Student>();
lstUD.Add(new Student() { ID = 1, Name = "First Name1", lstBk = lst });
lstUD.Add(new Student() { ID = 2, Name = "First Name2", lstBk = lst });
dataGridView1.DataSource = lstUD;
一種可能的解決方案是“展平” Book
列表。 如果我們將Books
ToString
方法重寫為 output 書籍ID
和Name
......然后我們可以向Student
class 添加一個屬性,該屬性從列表中的所有Books
創建單個字符串。 就像是…
書課…
public class Book {
public int ID { get; set; }
public string Name { get; set; }
public override string ToString() {
return ID + " - " + Name;
}
}
然后在 Student Class 中創建一個新的string
屬性ListOfBooks
。 這將顯示在網格中。 就像是...
public class Student {
public int ID { get; set; }
public string Name { get; set; }
public List<Book> lstBk { get; set; }
public string ListOfBooks {
get {
return string.Join(", ", lstBk);
}
}
}
這會將列表中的所有書籍放入網格中的單個單元格中。 如果單元格中的數據太多,那么我建議使用帶有兩個網格的主從細節。 一個供學生使用,另一個用於在“學生/碩士”網格中顯示“選定”學生的書籍。
使用帶有兩個網格的 Master-Detail。
創建一個新的 winforms 項目,將幾個DataGridView
拖放到表單上,下面的代碼應該演示一種使用您發布的類實現 Master-Detail 的方法。
在這種情況下,除了Student
class 中添加的ListOfBooks
屬性之外,顯然不需要Book
ToString
覆蓋。 它們可能看起來像原來的帖子……
public class Book {
public int ID { get; set; }
public string Name { get; set; }
}
public class Student {
public int ID { get; set; }
public string Name { get; set; }
public List<Book> lstBk { get; set; }
}
當用戶“選擇”“學生/碩士”網格中的不同單元格時,我們將需要一些機制來“發出信號”。 為此,我們將連接網格SelectionChanged
事件。 在這種情況下,代碼將網格中選定的Student
“投射”到Student
object,然后使用Students
lstBk
列表顯示到“書籍/詳細信息”網格中。 此事件可能如下所示...
private void dataGridView1_SelectionChanged(object sender, EventArgs e) {
Student student = (Student)dataGridView1.CurrentRow.DataBoundItem;
dataGridView2.DataSource = student.lstBk;
}
加載網格時,在大多數情況下,使用主網格中的第一行填充詳細信息網格,這是默認選擇的單元格。
為了完成這個示例,將 10 名Students
添加到“學生/碩士”網格中,這樣每個學生都有 1 到 6 本書之間的隨機數量。
List<Student> AllStudents;
Random rand;
public Form1() {
InitializeComponent();
dataGridView1.SelectionChanged += new EventHandler(dataGridView1_SelectionChanged);
AllStudents = new List<Student>();
rand = new Random();
}
private void Form1_Load(object sender, EventArgs e) {
for (int i = 1; i < 11; i++) {
AllStudents.Add(GetStudent(i, "Student_" + i + 1));
}
dataGridView1.DataSource = AllStudents;
dataGridView2.DataSource = AllStudents[0].lstBk;
}
private Student GetStudent(int studentID, string name) {
int numberOfBooks = rand.Next(1, 7);
int bookNumber;
List<Book> books = new List<Book>();
for (int i = 0; i < numberOfBooks; i++) {
bookNumber = rand.Next(1, 10000);
books.Add(new Book { ID = bookNumber, Name = "Book" + bookNumber });
}
return new Student { ID = studentID, Name = name, lstBk = books };
}
我希望這是有道理的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.