【问题标题】:What is preventing my List data from displaying in my DataGridView?是什么阻止了我的列表数据在我的 DataGridView 中显示?
【发布时间】:2021-02-13 10:59:14
【问题描述】:

我通过简单地填充一个 List 然后将 List 分配给 DataGridView 的 DataSource 属性,将我的列表数据放入我的 DataGridView 中,但是在将列标题更改为不同于组成的类成员的名称之后列表,分配不再有效。

至少,网格中没有数据显示。

“有趣”的是它仍然在网格中插入适量的行(尽管是空的):

一开始我在网格中放置了 14 个“假”(占位符)行。我不知道为什么更改列标题中的文本会导致工作中出现问题。

我在它工作时所做的唯一更改(但列标题很丑)现在是这样的:

dataGridView1.AutoGenerateColumns = false;

-以及新列的添加:

dataGridView1.Columns.Add("MovieTitle", "Title");

. . .

private void frmMain_Load(object sender, EventArgs e)
{
    dataGridView1.AutoGenerateColumns = false;
    LoadInitialData();
}

private void LoadInitialData()
{
    List<MoviesSingleTable> listStartupData = new List<MoviesSingleTable>();
    MoviesSingleTable mgdc;
    //1
    mgdc = new MoviesSingleTable
    {
    MovieTitle = "The Princess Bride",
    IMDBRating = 8.1,
    MPAARating = "PG",
    durationInMinutes = 98,
    YearReleased = "1987",
    genres = "", // will add these later
    actors = "",
    directors = "",
    screenwriters = ""
    };
    listStartupData.Add(mgdc);

    . . .

    //14
    mgdc = new MoviesSingleTable();
    mgdc.MovieTitle = "Will Penny";
    mgdc.IMDBRating = 7.1;
    mgdc.MPAARating = "NR"; // "Approved"
    mgdc.durationInMinutes = 108;
    mgdc.YearReleased = "1967";
    mgdc.genres = "";
    mgdc.actors = "";
    mgdc.directors = "";
    mgdc.screenwriters = "";
    listStartupData.Add(mgdc);

    dataGridView1.DataSource = listStartupData;
    ConfigureGrid(); 
}

private void ConfigureGrid()
{
    dataGridView1.BorderStyle = BorderStyle.Fixed3D;

    dataGridView1.Columns.Add("MovieTitle", "Title");
    dataGridView1.Columns.Add("IMDBRating", "IMDB");
    dataGridView1.Columns.Add("MPAARating", "MPAA");
    dataGridView1.Columns.Add("durationInMinutes", "Minutes");
    dataGridView1.Columns.Add("YearReleased", "Year");
    dataGridView1.Columns.Add("genres", "Genres");
    dataGridView1.Columns.Add("actors", "Actors");
    dataGridView1.Columns.Add("directors", "Directors");
    dataGridView1.Columns.Add("screenwriters", "Screenwriters");
}

使用的类是:

public class MoviesSingleTable
{
    public string MovieTitle { get; set; }
    public double IMDBRating { get; set; }
    public string MPAARating { get; set; }
    public int durationInMinutes { get; set; }
    public string YearReleased { get; set; }
    public string genres { get; set; }
    public string actors { get; set; }
    public string directors { get; set; }
    public string screenwriters { get; set; }
}

【问题讨论】:

标签: c# .net-core datagridview


【解决方案1】:

使用代码将列添加到网格时,需要将每列的 DataPropertyName 设置为与要在该列中显示的类属性名称匹配。

下面是一个帮助方法返回一个设置列DataPropertyName的列。

private DataGridViewTextBoxColumn GetColumnForGrid(string colName, string colHeader, string dataPropertyName) {
  DataGridViewTextBoxColumn dgvc = new DataGridViewTextBoxColumn();
  dgvc.Name = colName;
  dgvc.HeaderText = colHeader;
  dgvc.DataPropertyName = dataPropertyName;
  return dgvc;
}

另外,我建议您使用BindingList&lt;T&gt; 而不是List&lt;T&gt;

用法……

private void Form1_Load(object sender, EventArgs e) {
  BindingList<MoviesSingleTable> data = GetData();
  DataGridViewColumn col = GetColumnForGrid("MovieTitle", "Title", "MovieTitle");
  dataGridView1.Columns.Add(col);
  col = GetColumnForGrid("IMDBRating", "IMDB", "IMDBRating");
  dataGridView1.Columns.Add(col);
  dataGridView1.AutoGenerateColumns = false;
  dataGridView1.DataSource = data;
}

【讨论】:

  • 像冠军一样工作;我不知道 BindingList 是不是比较新,但我不记得以前听过它。
  • @B. Clay Shannon……这取决于您的要求。我不是专家,但是,BindingList 提供了更多功能。我想不出所有不同的好处,但我知道有一个好处是让DataGridView 在网格末尾显示一个空的“新”行,这允许用户添加新行。
  • 以当前的MoviesSingleTable 类为例,如果您使用List&lt;MoviesSingleTable&gt;,您将看不到这一新行。如果您使用BindingList&lt;MoviesSingleTable&gt;,那么用户将能够通过直接向网格中添加行来向列表中添加新项目。同样,这当然取决于您的要求。
猜你喜欢
  • 2018-05-05
  • 1970-01-01
  • 2015-12-12
  • 2013-08-15
  • 2016-12-09
  • 2020-11-20
  • 2012-03-08
  • 2017-11-16
  • 1970-01-01
相关资源
最近更新 更多