绑定到BindingList <t> - 选择要绑定的内容?</t>

时间:2009-07-24 20:29:27

标签: c# data-binding compact-framework bindinglist

假设我有一个名为Sample的业务对象,我有样本的BindingList。样本有4个属性。

我可以选择哪些属性绑定到DataGrid,还是没有选项可以自定义这样的东西?

注意: 我正在使用Compact Framework,其中没有DataGridView,以及Autogenerate属性和DataMember属性。

回复时请记住这一点。

3 个答案:

答案 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,但同样适用于大多数可绑定控件。

是的,你可以这样做。这样做的方法是一个两步过程

  • 将DataSource成员设置为BindingList<T>
  • 的实例
  • 将DataMember属性设置为要绑定的属性的字符串名称。