DevExpress GridControl 主视图不显示信息

DevExpress GridControl mainview not showing information

我有一个来自 Devexpress 的 GridControl,我用一个 DataRow 对象填充该控件。该行已添加到网格中,但单元格为空。这是代码:

        DataTable dt = new DataTable();
        dt.Columns.Add("Descripcion");
        dt.Columns.Add("Cantidad");
        dt.Columns.Add("Importe");
        gridControl1.DataSource = dt;

        clsLineaTicket newLn = new clsLineaTicket("Gin Tonic Beefeater", "1", "9,20");
        DataRow dr = dt.NewRow();
        dr[0] = newLn.strDescripcion;
        dr[1] = newLn.strCantidad;
        dr[2] = newLn.strImporte;
        dt.Rows.Add(dr);
        gridControl1.DataSource = dt;

代码非常简单,知道为什么不起作用吗?谢谢。

要解决您的问题,您应该将 GridColumns 的 FieldNames 设置为 DataTable 的 ColumnNames。

但我强烈建议您使用 List<clsLineaTicket> 而不是将其转换为 DataTable。

起初你已经有了一个对象,网格可以很好地处理这个问题。因此,将其转换为 DataRows 似乎是不必要的。不要忘记任何对象都需要 space 并且 DataRow 仍然是一个对象。

此外 List<clsLineaTicket> 为您提供对象访问而不是数据行访问。这更具可读性,也更适合重构。因此,您可以通过重构轻松重命名 属性。但是如何重命名 DataTable 中的列?您有时会访问 row["ColumnName"] 吗?然后你迷路了,因为魔法字符串无法重构。让我展示一个小例子,以提高 List<T>:

的可读性

认为您在事件中双击并显示您的门票价格:

//This event is just a dummy and doesn't exists this way
private void grid_click(object sender, EventArgs e)
{
   //DataTable access
   var row = gridview.GetFocusedRow() as DataRowView;
   MessageBox.Show(Convert.ToString(row["Price"]);

   //List access
   var lineaTicket = gridView.GetFocusedRow() as LineaTicket; //You directly see it's a ticket here
   MessageBox.Show(lineaTicket.Price); //You don't need conversion
}

另一个好处是 Lambda 和 Linq 的可能性。您需要一个子列表,其中包含价格低于 10 美元的所有门票?

List<clsLineaTicket> lowPriceTickets = ticketList.FindAll(ticket=>ticket.Price < 10);

如果您使用列表,请确保您的 FieldNames 对应于 属性names。如果你想让网格可编辑,你还需要在你的属性上实现 setter。

希望对您有所帮助。