簡體   English   中英

如何在winforms中將嵌套列表綁定到datagridview

[英]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 書籍IDName ......然后我們可以向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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM