2009-04-21 5 views
0

私はこのようなList<SomethingWrapper>インスタンスにDataGridを結合することによってタイプSomethingのオブジェクトのいくつかのプロパティを表示するために私Compact Frameworkの3.5ウィンドウモバイルプロフェッショナル6 SDKベースのプロジェクトでSystem.Windows.Forms.DataGridコントロールを使用しようとしている:DataSetではなくList <T>にバインドされたDataGridの列のサイズを変更するにはどうすればよいですか?

public class SomethingWrapper { 
    private Something data; 
    public SomethingWrapper(Something data) { this.data = data; } 
    public string Column1 { get { /* string from this.data */ } } 
    public string Column2 { get { /* string from this.data */ } } 
} 

public class SomethingList : List<SomethingWrapper> { 
    public SomethingList(IEnumerable<Something> items) { 
     foreach (var item in items) Add(new SomethingWrapper(item)); 
     Sort((a, b) => a.Column2.CompareTo(b.Column2); 
    } 
} 

/* ... */ 

IEnumerable<Something> dataToShow = /* assume this is filled correctly */ 
SomethingDataGrid.DataSource = new SomethingList(dataToShow); 

これはうまくいくようです:正しいデータは、Column1Column2という2つの列のグリッドに表示され、2番目の列でソートされます。私はこれをこのデータの読み込み専用のビューにしたいので、すべてうまくいきます。

しかし、私は列の幅を設定したいと思い、これが動作するように見えることはできません...

は明白なことを試みた:、TableStyleを作成し、列ごとにテキストボックスの列スタイルのインスタンスを作成し、それを追加しますTableStyleに設定し、結果の表スタイルにSomethingDataGrid.TableStyleを設定します。 (これはメモリからのものであり、私が使用しているコードも表示しています。必要ならば、後日、質問に追加することができます)。

しかし何も変わりません。私はこれがTableStyleオブジェクトのMappingNameと関係があると考えています。私が昨日の夕方に見つけることができるすべての例は、をDataGridにデータバインドし、をDataSetの正しい表名に設定するためのものです。さもなければ、テーブルスタイルはあなたが期待していることをしません。これは私が見ている動作です。

質問:私の問題の解決のために正しい場所を探していますか?もしそうなら、にバインドするときにTableStyle.MappingNameを設定して、T ...のプロパティを表示する必要がありますか?

(。。重複の可能性をチェックしようとしましたが、私はそこに間違っていることが判明した場合、私を修正してください正確に一致して見つけることができませんでした)

答えて

2

ああ、すべての後に十分に見ていない:duplicate question foundBindingList<T>から派生したり、バインディングソースを使用したりして、BindingSource.GetListName(null)を呼び出してMappingNameを取得します。これが役立つことを願っています。そうでない場合、私は戻ってきます...あなたがここのDataGridTableStyle

を作成することによってこれを行うことができます

+0

TableStyle.MappingName = BindingSource.GetListName(null)を使用すると正常に動作することがわかりました。 – peSHIr

1

は、私が使用して拡張メソッドです:

public static void SetColumnStyles<T>(this DataGrid ctrl, T data, params ColumnStyle[] column) where T: class 
    { 
     var ts = new DataGridTableStyle(); 
     ts.MappingName = data.GetType().Name; 

     foreach (var style in column) 
     { 
      ts.GridColumnStyles.AddColumn(style.Header, style.Column, style.Width); 
     } 

     ctrl.TableStyles.Clear(); 
     ctrl.TableStyles.Add(ts); 
    } 

は、その後、私はこのようにそれを呼び出します。

var newList = queriableData.ToList(); 
    ProductEdit.DataSource = newList; 
    ProductEdit.SetColumnStyles(newList, new[] 
             { 
              new ColumnStyle("Name", 200), 
              new ColumnStyle("Manufacturer", 100), 
              new ColumnStyle("Size", 20) 
             }); 

ここで、newListはオブジェクトの総称リストです。

+0

私はこれをやっていましたが、実際の質問は、「データセット以外のものにバインドするときにts.MappingNameを何に設定するのですか」という行に沿っていました。私はちょうどデータソースの型名を使うことができます。ありがとう。今度はBindingSourceコントロールを再度チャックできます。デザイナーのコラムを実際に見る必要はありません。 ;-) – peSHIr

+0

ああ、バインドする前に.ToList()が必要です。申し訳ありませんが、私はそれを逃した。私はコードの残りの部分があなたにとって有益であることを願っています。 –

+0

MappingName = GetType()。Nameという名前を試しましたが、動作していないようです。ListAccessorsがnullに設定されているときにGetType()に値するデータの型名を返すListBindingHelper.GetListName()のMSDNの説明にあるとおり、これを期待しています。今すぐ困った。後でそれを調べるかもしれない。 BindingSourceとBindingSource.GetListName(null)をTableNameとして使用することは、引き続き有効です。それで今は大丈夫です。 – peSHIr

関連する問題