문제

내에 하위 객체가있는 객체로 작업 중입니다 (아래 예제 참조). 나는 묶으려고 노력하고있다 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" />
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top