8

内部にサブオブジェクトを持つオブジェクトを操作しています (以下の例を参照)。をデータグリッドにバインドしようとしてList<rootClass>います。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; } }
}
4

4 に答える 4

9

(タグ)について言及しているのでDataGridViewColumn、winformsを意味していると思います。

サブプロパティへのアクセスは面倒です。currency-manager はリストにバインドされているため、デフォルトでは直接のプロパティにしかアクセスできません。ただし、絶対に必要な場合は、カスタム型記述子を使用してこれを回避できます。「Foo.Bar」の代わりに「Foo_Bar」など、別のトークンも使用する必要があります。ただし、これは、 の知識を必要とする大量の作業であり、おそらく の知識が必要でありPropertyDescriptorICustomTypeDescriptorそのTypeDescriptionProvider価値がないことはほぼ確実です。

最も簡単な修正は、プロパティをシム/パススルーとして公開することです。

public string Value2Description {
    get {return Value2.Description;} // maybe a null check too
}

次に、「Value2Description」などにバインドします。

于 2009-01-03T12:10:03.447 に答える
8

私が間違っていなければ、subObject で .ToString() を呼び出した結果が表示されるので、それをオーバーライドして Description の内容を返すことができます。

Value1.Description にバインドしようとしましたか? (私はそれがうまくいかないと思います)。

バインド時に List の代わりに使用できるクラスがあります。これはこれを処理します。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);
于 2009-01-02T15:49:33.647 に答える
3

ASP.NET を使用しているかどうかはわかりませんが、使用している場合は、テンプレート列と Eval() メソッドを使用して、ネストされたオブジェクトの値を表示できます。たとえば、サブオブジェクトの Description プロパティを表示するには:

<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>
于 2009-01-02T17:27:10.173 に答える
1

それがあなたが求めているこのようなものであるかどうかわからない...

次のようなメソッドを作成できます。

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" />
于 2011-08-24T14:18:30.523 に答える