我有一个来自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;
代码很简单,任何想法为什么不起作用?谢谢。
答案 0 :(得分:1)
要解决您的问题,您应该将GridColumns的FieldNames设置为DataTable的ColumnNames。
但我强烈建议您使用List<clsLineaTicket>
而不是将其转换为DataTable。
首先,你已经有了一个对象,Grid可以很好地处理这个问题。因此将其转换为DataRows似乎是不必要的。不要忘记任何对象需要空间,DataRow仍然是一个对象。
此外,List<clsLineaTicket>
为您提供对象访问而非DataRow访问。这对于重构来说更具可读性和更好。因此,您可以通过重构轻松地重命名属性。但是如何重命名DataTable中的列?您有时会访问行[&#34; ColumnName&#34;]?然后你迷失了,因为魔法弦不能被重构。让我举一个小例子来说明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的可能性。你需要一个带有门票的SubList,价格低于10美元?
List<clsLineaTicket> lowPriceTickets = ticketList.FindAll(ticket=>ticket.Price < 10);
如果您使用List,请确保您的FieldNames与Propertynames相对应。如果您想使Grid可编辑,您还需要在Properties上实现setter。
希望这有帮助。