2009-08-04 5 views
47

私は周りを走り回っているようで、最後の時間にそうしています。リストをdataGridViewにバインドする方法は?

文字列の配列からデータグリッドビューを取り込みたいとします。私はそれを直接読むことはできませんし、パブリックプロパティとして文字列を保持するカスタムタイプを作成する必要があることを私は知っています。

public class FileName 
    { 
     private string _value; 

     public FileName(string pValue) 
     { 
      _value = pValue; 
     } 

     public string Value 
     { 
      get 
      { 
       return _value; 
      } 
      set { _value = value; } 
     } 
    } 

これはコンテナクラスであり、それは単純に文字列の値を持つプロパティを持つ:だから私は、クラスを作りました。今私が望むのは、そのデータソースをListにバインドするときに、datagridviewに表示される文字列だけです。

また、このメソッドBindGrid()を使って、datagridviewを埋めたいと思います。ここでは、次のとおりです。

private void BindGrid() 
    { 
     gvFilesOnServer.AutoGenerateColumns = false; 

     //create the column programatically 
     DataGridViewTextBoxColumn colFileName = new DataGridViewTextBoxColumn(); 
     DataGridViewCell cell = new DataGridViewTextBoxCell(); 
     colFileName.CellTemplate = cell; colFileName.Name = "Value"; 
     colFileName.HeaderText = "File Name"; 
     colFileName.ValueType = typeof(FileName); 

     //add the column to the datagridview 
     gvFilesOnServer.Columns.Add(colFileName); 

     //fill the string array 
     string[] filelist = GetFileListOnWebServer(); 

     //try making a List<FileName> from that array 
     List<FileName> filenamesList = new List<FileName>(filelist.Length); 
     for (int i = 0; i < filelist.Length; i++) 
     { 
      filenamesList.Add(new FileName(filelist[i].ToString())); 
     } 

     //try making a bindingsource 
     BindingSource bs = new BindingSource(); 
     bs.DataSource = typeof(FileName); 
     foreach (FileName fn in filenamesList) 
     { 
      bs.Add(fn); 
     } 
     gvFilesOnServer.DataSource = bs; 
    } 

最後に、問題:文字列配列は、リストが作成され、[OK]、[OK]を塗りつぶし、私はDataGridViewの中に空の列を取得します。私もデータソース=リスト<を試してみました。= bindingsourceの代わりに、まだ何もありません。

私は本当に助言に感謝します、これは私を狂って運転しています。

+0

注目すべきことは、プロパティのオブジェクトのパブリックフィールドだけがグリッド内でレンダリングされることです。言い換えれば、彼らは{get;セット; }が定義されているか、無視されます。 – Shane

答えて

69

BindingListを使用して、列のDataPropertyName -Propertyを設定していただきありがとうございます。

次のことを試してみてください。

... 
private void BindGrid() 
{ 
    gvFilesOnServer.AutoGenerateColumns = false; 

    //create the column programatically 
    DataGridViewCell cell = new DataGridViewTextBoxCell(); 
    DataGridViewTextBoxColumn colFileName = new DataGridViewTextBoxColumn() 
    { 
     CellTemplate = cell, 
     Name = "Value", 
     HeaderText = "File Name", 
     DataPropertyName = "Value" // Tell the column which property of FileName it should use 
    }; 

    gvFilesOnServer.Columns.Add(colFileName); 

    var filelist = GetFileListOnWebServer().ToList(); 
    var filenamesList = new BindingList<FileName>(filelist); // <-- BindingList 

    //Bind BindingList directly to the DataGrid, no need of BindingSource 
    gvFilesOnServer.DataSource = filenamesList 
} 
+1

Dksonあなたは私を救った。これはうまくいった。列の "DataPropertyName"が表示されないのはどうですか?私はそのような簡単なことを聞​​いて悪いと感じ、私はそれを見たはずです。私がまだ持っている唯一の質問は、BindingSourceを実際に使用する必要があるときです。しかし、それは私が練習で時間内に見つけ出すものです。 –

+2

BindingSourceの機能 が本当に必要な場合は、BindingSourceを使用する必要があります。 BindingSourceの一般的な使い方は、ユーザーがフォームで入力を行う必要がある場合です。この場合、BindingSourceを複数のコントロールに一度にバインドできます。 BindingSourceにはもっと多くのことがありますが、実際にはそれを必要としないときは、BindingListのような簡単な方法を使用してください。 – sloth

+1

元気で、これは私が今日探していたものでした。おそらく、私は一時間くらいの時間を節約しました。ありがとう! –

3

の代わりにあなたがのdataTableを使用することができ、新たなコンテナクラスを作成します。この問題の詳細

DataTable dt = new DataTable(); 
dt.Columns.Add("My first column Name"); 

dt.Rows.Add(new object[] { "Item 1" }); 
dt.Rows.Add(new object[] { "Item number 2" }); 
dt.Rows.Add(new object[] { "Item number three" }); 

myDataGridView.DataSource = dt; 

あなたはここで見つけることができます:http://psworld.pl/Programming/BindingListOfString

10

は少し遅れますが、将来のために有用である可能性があります。あなたは、セルおよびヘッダーテキストとセルの値を持つ唯一の懸念のカスタムプロパティを設定する必要がない場合は、このコードはあなたの

public class FileName 
{   
    [DisplayName("File Name")] 
    public string FileName {get;set;} 
    [DisplayName("Value")] 
    public string Value {get;set;} 
} 

を助けると、あなたは

private void BindGrid() 
{ 
    var filelist = GetFileListOnWebServer().ToList();  
    gvFilesOnServer.DataSource = filelist.ToArray(); 
} 

としてデータソースとしてリストをバインドすることができますあなたはこのページにアクセスすることができます詳細についてはBind List of Class objects as Datasource to DataGridView

希望これはあなたに役立ちます。

+1

あなたのリンクが死んでいます。別の情報源を提供できますか? – Scorpion

+1

なぜあなたは 'filelist.ToArray()'を呼び出して新しい配列を割り当てるオーバーヘッドがありますか?私は 'gvFilesOnServer.DataSource = filelist;'で十分だと思います。リスト上で '.ToArray()'を呼び出すと、不要なオーバーヘッドのように思えます。 –

1

DataTableの使用は、user927524が指定されている場合に有効です。 また、特定のラッピングクラスを追加する必要はありませんこれは、手動で行を追加することによってそれを行うことができます。いずれの場合で

List<string> filenamesList = ...; 
foreach(string filename in filenamesList) 
     gvFilesOnServer.Rows.Add(new object[]{filename}); 

が、おかげでこの奇妙な振る舞いをクリアするためのuser927524!

6

私はこれが古いことを知っていますが、これはしばらく私を抱きしめました。リスト内のオブジェクトのプロパティは、パブリックメンバーだけでなく、実際の「プロパティ」でなければなりません。

public class FileName 
{   
    public string ThisFieldWorks {get;set;} 
    public string ThisFieldDoesNot; 
} 
+0

時間を節約してデバッグできました。ありがとうございました! –