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。
希望对您有所帮助。
我有一个来自 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。
希望对您有所帮助。