簡體   English   中英

綁定到BindingList <T> - 選擇要綁定的內容?

[英]Binding to BindingList<T> - choose what to bind?

假設我有一個名為Sample的業務對象,我有樣本的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; 


編輯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;} } 

我已經用幾種不同的方式處理了這個問題,希望這有用。

正如Justin所提到的,第一個選項是設置AutoGennerateColumns = false,並從那里手動執行。 如果綁定它,運行時將為Sample的所有公共屬性創建列。 如果你想刪除它們,你可以這樣做

DataGridView.Columns["SomePropertyOfSample"].Remove();

此解決方案有點問題,因為您需要保持更新,並明確刪除項目。

Justin的Edit 2選項在屬性上將Browsable屬性設置為false很有意思,我之前沒有嘗試過。

我最終使用的解決方案,以及我認為非常好的解決方案圍繞着一個接口。

我有兩個不同的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>();

並綁定到那個。

如果您想稍后添加列,只需將它們添加到適當的界面即可。

這對我的項目很有用,讓我知道你的想法。

我假設您在WinForms中表示DataGrid,但同樣適用於大多數可綁定控件。

是的,你可以這樣做。 這樣做的方法是兩步過程

  • 將DataSource成員設置為BindingList<T>的實例。
  • 將DataMember屬性設置為要綁定的屬性的字符串名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM