7

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

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

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

请在回复时记住这一点。

4

3 回答 3

11
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;}
}
于 2009-07-24T20:38:26.990 回答
1

我已经处理了几种不同的方法,希望这会有所帮助。

正如 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>();

并绑定到那个。

如果您想稍后添加列,只需将它们添加到相应的界面即可。

这对我的项目很有效,让我知道你的想法。

于 2009-08-06T18:41:53.570 回答
0

我假设您指的是 WinForms 中的 DataGrid,但这同样适用于大多数可绑定控件。

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

  • 将 DataSource 成员设置为BindingList<T>.
  • 将 DataMember 属性设置为要绑定的属性的字符串名称。
于 2009-07-24T20:33:11.757 回答