假设我有一个名为 Sample 的业务对象,并且我有 Samples 的 BindingList。一个样本有 4 个属性。
我可以选择哪些属性绑定到 DataGrid 或者没有选项来自定义这样的东西?
注意:我使用的是 Compact Framework,其中没有 DataGridView,以及 Autogenerate 属性和 DataMember 属性。
请在回复时记住这一点。
假设我有一个名为 Sample 的业务对象,并且我有 Samples 的 BindingList。一个样本有 4 个属性。
我可以选择哪些属性绑定到 DataGrid 或者没有选项来自定义这样的东西?
注意:我使用的是 Compact Framework,其中没有 DataGridView,以及 Autogenerate 属性和 DataMember 属性。
请在回复时记住这一点。
BindingList<Sample> samples = new BindingList<Sample>();
DataGridView dgv = new DataGridView();
dgv.DataSource = samples;
这应该将每个公共属性显示为 DataGridView 上的一列。如果要更改显示的属性,还需要执行以下操作:
dgv.AutoGenerateColumns = false;
并进入 datagridview 的属性,手动添加列并将 DataPropertyName 设置为属性名称。
如果您在代码中创建了 datagridview,以下将创建一列并将其添加到 dgv。
DataGridViewColumn dgvc = new DataGridViewColumn();
dgvc.Name = "PropertyA";
dgvc.HeaderText = "Property A";
dgvc.DataPropertyName = "PropertyA";
dgv.Columns.Add(dgvc);
这应该给你一些更接近你想要的东西。但是,因为它使用匿名类,所以不能使用 BindingList(我知道)。或者,您可以创建一个 SampleBinding 类,该类仅具有您想要显示的属性,并从普通样本列表中生成这些属性。
public class Sample
{
public int PropertyA {get;set;}
public bool PropertyB {get;set;}
public string PropertyC {get;set;}
public double PropertyD {get;set;}
}
List<Sample> samples = new List<Samples>(GetSamples());
var sampleBinding = from sample in samples
select new
{
PropertyA = sample.PropertyA,
PropertyC = sample.PropertyC
};
BindingList bl = new BindingList();
bl.DataSource = sampleBinding;
dgv.DataSource = bl;
public class Sample
{
[Browsable(false)]
public int PropertyA {get;set;}
public bool PropertyB {get;set;}
public string PropertyC {get;set;}
[Browsable(false)]
public double PropertyD {get;set;}
}
我已经处理了几种不同的方法,希望这会有所帮助。
正如 Justin 所提到的,第一个选项是设置 AutoGennerateColumns = false,然后从那里手动进行。如果绑定它,运行时将为 Sample 的所有公共属性创建列。如果要删除它们,可以使用
DataGridView.Columns["SomePropertyOfSample"].Remove();
这个解决方案有点问题,因为您需要保持更新,并明确删除项目。
Justin 的 Edit 2 选项将属性上的 Browsable 属性设置为 false 很有趣,我之前没有尝试过。
我最终使用的解决方案,我认为效果很好的解决方案是围绕界面展开的。
我有两个不同的 DataGridViews 需要显示相同的数据,但每次显示和隐藏不同的列。在这种情况下,你会这样做:
public interface ISimpleSample
{
string Name {get;}
int ID {get;}
}
public interface IAdvancedSample
{
string Name {get; set;}
int ID {get; set;}
string Make {get; set;}
string Model {get; set;}
}
public class Sample : ISimpleSample, IAdvancedSample
{
//Implementation skipped
}
然后,您使用
BindingList<ISimpleSample> = new BindingList<ISimpleSample>();
并绑定到那个。
如果您想稍后添加列,只需将它们添加到相应的界面即可。
这对我的项目很有效,让我知道你的想法。
我假设您指的是 WinForms 中的 DataGrid,但这同样适用于大多数可绑定控件。
是的,你可以这样做。做到这一点的方法是一个两步的过程
BindingList<T>
.