서브 오브젝트가있는 객체를 Datagrid의 속성으로 바인딩
-
03-07-2019 - |
문제
내에 하위 객체가있는 객체로 작업 중입니다 (아래 예제 참조). 나는 묶으려고 노력하고있다 List<rootClass>
Datagrid에. 내가 묶을 때 List<>
, subObject
, 나는 다음 가치를 본다 ... "namespace.subObject" ...
문자열 값이 올바르게 표시됩니다.
이상적으로는“설명”속성을보고 싶습니다. subObject
데이터 셀에서. 어떻게 매핑 할 수 있습니까? subObject.Description
데이터셀에 보여주기 위해?
public class subObject
{
int id;
string description;
public string Description
{ get { return description; } }
}
public class rootClass
{
string value1;
subObject value2;
string value3;
public string Value1
{ get { return value1; } }
public subObject Value2
{ get { return value2; } }
public string Value3
{ get { return value3; } }
}
해결책
내가 착각하지 않으면 서브 버젝트에서 .tostring ()을 호출 한 결과를 보여 주므로 설명의 내용을 반환하기 위해이를 무시할 수 있습니다.
value1.description에 바인딩을 시도 했습니까? (작동하지 않는 것 같아요).
바인딩시 목록 대신 사용할 수있는 클래스가 있습니다.이를 처리 할 수있는 Itypedlist를 구현하여 계산 된 속성을 포함하여 컬렉션이 해당 객체에 더 많은 "속성"을 제공 할 수 있습니다.
내가 가진 파일의 마지막 버전은 여기에 있습니다.
https://gist.github.com/lassevk/64ecea836116882a5d59b0f235858044
사용:
List<rootClass> yourList = ...
TypedListWrapper<rootClass> bindableList = new TypedListWrapper<rootClass>(yourList);
bindableList.BindableProperties = "Value1;Value2.Description;Value3.Description";
gridView1.DataSource = bindableList;
기본적으로 당신은 인스턴스에 묶습니다 TypedList<T>
대신에 List<T>
, BindableProperties 속성을 조정하십시오. BindableProperties를 자동으로 구축하는 것을 포함하여 작업에 약간의 변경 사항이 있지만 아직 트렁크에 있지 않습니다.
다음과 같이 계산 된 속성을 추가 할 수도 있습니다.
yourList.AddCalculatedProperty<Int32>("DescriptionLength",
delegate(rootClass rc)
{
return rc.Value2.Description.Length;
});
또는 .NET 3.5 :
yourList.AddCalculatedProperty<Int32>("DescriptionLength",
rc => rc.Value2.Description.Length);
다른 팁
당신이 언급 한 이후 DataGridViewColumn
(태그), 나는 당신이 Winforms를 의미한다고 가정합니다.
하위 단점에 접근하는 것은 고통입니다. 통화 관리자는 목록에 묶여 있으므로 기본적으로 즉각적인 속성에만 액세스 할 수 있습니다. 그러나 이것을 지나갈 수 있습니다 당신이 절대적으로 필요하다면 사용자 정의 유형 설명자를 사용하여. "foo.bar"대신 "foo_bar"와 같은 다른 토큰을 사용해야합니다. 그러나 이것은 a입니다 주요한 지식이 필요한 일의 양 PropertyDescriptor
, ICustomTypeDescriptor
그리고 아마도 TypeDescriptionProvider
, 그리고 거의 확실히 그만한 가치가 없습니다.
가장 간단한 수정은 속성을 Shim / Pass-Stru로 노출시키는 것입니다.
public string Value2Description {
get {return Value2.Description;} // maybe a null check too
}
그런 다음 "value2description"등에 바인딩하십시오.
ASP.NET을 사용하는지 여부는 확실하지 않지만 그렇다면 템플릿 열과 Eval () 메소드를 사용하여 중첩 된 객체의 값을 표시 할 수 있습니다. 예를 들어 서브 버젝트의 설명 속성을 표시하려면 다음과 같습니다.
<asp:GridView ID="grid" runat="server" AutoGenerateColumns="true">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:Literal Text='<%# Eval("Value2.Description") %>' runat="server" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
그것이 당신이 이와 같은 것인지 확실하지 않습니다 ...
다음과 같은 방법을 쓸 수 있습니다.
protected string getSubObject(object o)
{
string result = string.empty;
try
{
result = ((subObject)o).Description;
}
catch
{ /*Do something here to handle/log your exception*/ }
return result;
}
그런 다음 물체를 다음과 같은 바인딩합니다.
<asp:Literal Text='<%# getSubObject(Eval("Value2")) %>' runat="server" />