假设我有一个名为Sample的业务对象,我有样本的BindingList。样本有4个属性。
我可以选择哪些属性绑定到DataGrid,还是没有选项可以自定义这样的东西?
注意: 我正在使用Compact Framework,其中没有DataGridView,以及Autogenerate属性和DataMember属性。
回复时请记住这一点。
答案 0 :(得分:10)
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;
<小时/> 编辑2
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;}
}
答案 1 :(得分:1)
我已经用几种不同的方式处理了这个问题,希望这很有帮助。
Justin提到的第一个选项是设置AutoGennerateColumns = false,并从那里手动执行。如果绑定它,运行时将为Sample的所有公共属性创建列。如果要删除它们,可以使用
执行此操作DataGridView.Columns["SomePropertyOfSample"].Remove();
此解决方案有点问题,因为您需要保持更新,并明确删除项目。
贾斯汀在属性上将Browsable属性设置为false的Edit 2选项很有意思,我之前没有尝试过。
我最终使用的解决方案,以及我认为非常好的解决方案围绕着一个界面。
我有两个不同的DataGridViews需要显示相同的数据,但每次都显示和隐藏不同的colums。在这种情况下,你会这样做:
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
}
然后使用
创建Sample集合BindingList<ISimpleSample> = new BindingList<ISimpleSample>();
并绑定到那个。
如果您想稍后添加列,只需将它们添加到适当的界面即可。
这对我的项目很有用,让我知道你的想法。
答案 2 :(得分:0)
我假设您在WinForms中表示DataGrid,但同样适用于大多数可绑定控件。
是的,你可以这样做。这样做的方法是一个两步过程
BindingList<T>
。