我有一个 DataGridView 和一个我想显示的对象列表。
对象是这些:
public class Entity
{
public int ID { get; set; }
}
public class Travel: Entity
{
public Service Service { get; set; }
public City Source { get; set; }
public City Destiny { get; set; }
public decimal Price { get; set; }
}
public class Service: Entity
{
public string Name { get; set; }
}
public class City: Entity
{
public string Name { get; set; } // Max 50 chars
}
Run Code Online (Sandbox Code Playgroud)
在我的表单中,我绑定了这样的旅行对象列表:
List<Travel> travels = logic.GetAllTravels();
DgvRecorridos.DataSource = travels;
Run Code Online (Sandbox Code Playgroud)
我得到以下信息:

我想获取服务名称、源城和命运城。
提前致谢。
而不是执行以下代码:
List<Travel> travels = logic.GetAllTravels();
DgvRecorridos.DataSource = travels;
Run Code Online (Sandbox Code Playgroud)
做这个:
List<Travel> travels = logic.GetAllTravels();
BindingSource bs = new BindingSource();
bs.DataSource = travels;
DgvRecorridos.AutoGenerateColumn = false;
DgvRecorridos.DataSource = bs;
Run Code Online (Sandbox Code Playgroud)
然后,手动添加列:
DataGridViewColumn col1 = new DataGridViewTextBoxColumn();
col1.DataPropertyName = "Service.Name";
col1.HeaderText = "Service Name";
dataGridView1.Columns.Add(col1);
DataGridViewColumn col2 = new DataGridViewTextBoxColumn();
col2.DataPropertyName = "City.Name";
col2.HeaderText = "City Name";
dataGridView1.Columns.Add(col2);
DataGridViewColumn col3 = new DataGridViewTextBoxColumn();
col3.DataPropertyName = "City.Name";
col3.HeaderText = "Destiny Name";
dataGridView1.Columns.Add(col3);
DataGridViewColumn col4 = new DataGridViewTextBoxColumn();
col4.DataPropertyName = "Price";
col4.HeaderText = "Price";
dataGridView1.Columns.Add(col4);
Run Code Online (Sandbox Code Playgroud)
然后,为 DataGridView 添加一个单元格格式化事件处理程序:
private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
if (dataGridView1.Rows[e.RowIndex].DataBoundItem != null &&
dataGridView1.Columns[e.ColumnIndex].DataPropertyName.Contains("."))
{
e.Value = BindProperty(dataGridView1.Rows[e.RowIndex].DataBoundItem,
dataGridView1.Columns[e.ColumnIndex].DataPropertyName);
}
}
private string BindProperty(object property, string propertyName)
{
string retValue = "";
if (propertyName.Contains("."))
{
PropertyInfo[] arrayProperties;
string leftPropertyName;
leftPropertyName = propertyName.Substring(0, propertyName.IndexOf("."));
arrayProperties = property.GetType().GetProperties();
foreach (PropertyInfo propertyInfo in arrayProperties)
{
if (propertyInfo.Name == leftPropertyName)
{
retValue = BindProperty(propertyInfo.GetValue(property, null),
propertyName.Substring(propertyName.IndexOf(".") + 1));
break;
}
}
}
else
{
Type propertyType;
PropertyInfo propertyInfo;
propertyType = property.GetType();
propertyInfo = propertyType.GetProperty(propertyName);
retValue = propertyInfo.GetValue(property, null).ToString();
}
return retValue;
}
Run Code Online (Sandbox Code Playgroud)
有关单元格格式的完整指南,请在Antonio Bello 的博客上浏览此处,这是我想到的地方。^_^ 两天前我也在这里问了同样的问题,得到了和你一样的答案,我知道这也不是你想做的。希望对你有帮助。
List<Travel> travels = logic.GetAllTravels();
var _bind = from a in travels
select new
{
Servicename = a.Service.Name,
SourceName = a.Source.Name,
DestinyName = a.Destiny.Name,
Price = a.Price
};
DgvRecorridos.DataSource = _bind;
Run Code Online (Sandbox Code Playgroud)
或者
List<Travel> travels = logic.GetAllTravels();
var _bind = travels.Select(a => new
{
Servicename = a.Service.Name,
SourceName = a.Source.Name,
DestinyName = a.Destiny.Name,
Price = a.Price
});
DgvRecorridos.DataSource = _bind;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
25842 次 |
| 最近记录: |