[英]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;
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,但同樣適用於大多數可綁定控件。
是的,你可以這樣做。 這樣做的方法是兩步過程
BindingList<T>
的實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.