2016-12-06 46 views
-1

私はStudentViewModelオブジェクトのリストを持っています。このリストをDataGridViewでバインドしています。列生成は、バインドされたモデルのプロパティに従って自動的に設定されます。 StudentViewModelでカスタム属性を持つC#LINQ selectプロパティ

public async Task LoadGridView() 
    { 
     Tuple<List<StudentViewModel>, int> result = await App.StudentService.SearchAsync(studentRequestModel); 
     dataGridView1.DataSource = null; 
     dataGridView1.DataSource = result.Item1; 
    } 

、私は、カスタム属性IsViewableとプロパティの一部が飾られています。

[AttributeUsage(AttributeTargets.Property)] 
public class IsViewable: Attribute 
{ 
    public bool Value { get; set; } 
} 

用法:

 [IsViewable(Value = true)] 
     public string Name { get; set; } 

アイデアだけでUIコントロールにバインドする前に、私はリストをフィルタリングして、私のグリッドが移入されるように、匿名オブジェクトの新しいリストを作りたい、です選択したプロパティのみ。

enter image description here

注:私はグリッドに固有の別のビューモデルを作成する必要はありません。パフォーマンス上の問題が発生した場合、私はそれをリファクタリングします。

+2

動的遺伝子への道はありませんプロパティーはコンパイル時に知る必要があるため、匿名型を評価します。ディクショナリを使って名前と値をマップしたり、「ExpandoObject」を設定したり、「dynamic」を使ってプロパティのような構文を得ることができます。そのどちらか、または新しい 'o'を作成し、その属性を持つプロパティを動的にコピーします。 –

+0

この回答は役に立ちます:https://stackoverflow.com/a/4938442/1220550 –

+1

私が正しく理解していれば、これらのプロパティを 'DataGridView'で表示させたくありません。これがあなたの望むものなら、カスタム 'IsViewable'の代わりに' [Browsable(false)] '属性を使って達成できませんか? –

答えて

0

キャッチは、私は動的リストをシリアライズし、次にデシリアライズします。そのダイナミックリストをdatagridviewでバインドすると、魅力的に機能しました。

enter image description here

プロジェクト全体は、ここにfoyzulkarim/GenericComponents

発信者/使用見つけることができます:

 Type type = typeof(StudentViewModel); 
     PropertyInfo[] properties = type.GetProperties(); 
     var infos = properties.Where(x => x.CustomAttributes.Any(y => y.AttributeType == typeof(IsViewable))).ToList(); 
     List<StudentViewModel> models = result.Item1; 
     List<dynamic> list = models.Select(x => GetValue(x, infos)).ToList(); 
     string serializeObject = JsonConvert.SerializeObject(list); 
     var deserializeObject = JsonConvert.DeserializeObject<List<dynamic>>(serializeObject); 
     dataGridView1.DataSource = deserializeObject; 

enter image description here

enter image description here

関連する問題