web-dev-qa-db-ja.com

リストをdataGridViewにバインドする方法は?

私は輪になって走り回っているようで、最後の数時間でそうしています。

文字列の配列からdatagridviewを作成します。不可能ということを直接読みましたが、文字列をパブリックプロパティとして保持するカスタムタイプを作成する必要があります。だから私はクラスを作りました:

public class FileName
    {
        private string _value;

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

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

これはコンテナクラスであり、文字列の値を持つプロパティのみを持っています。データソースをリストにバインドすると、その文字列が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;
    }

最後に、問題:文字列配列が正常に入力され、リストが正常に作成されますが、datagridviewに空の列が表示されます。また、= bindingsourceの代わりにdatasource = list <>を直接試しましたが、まだ何もしていません。

アドバイスをいただければ幸いです。これは私を夢中にさせています。

49
Amc_rtty

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 
}
72
sloth

少し遅れる可能性がありますが、将来的には便利です。セルのカスタムプロパティを設定する必要がなく、ヘッダーテキストとセル値のみを考慮する必要がある場合、このコードが役立ちます

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

次に、Listをデータソースとして次のようにバインドできます。

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

詳細については、このページにアクセスしてください DatasourceとしてのクラスオブジェクトのリストをDataGridViewにバインド

これがあなたのお役に立てば幸いです。

12
Nasir Mahmood

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

public class FileName
{        
     public string ThisFieldWorks {get;set;}
     public string ThisFieldDoesNot;
}
7
Kevin Finck

新しいContainerクラスを作成する代わりに、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

3
PsCraft

User927524が述べているように、DataTableの使用は有効です。行を手動で追加することでもできます。特定のラッピングクラスを追加する必要はありません。

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

いずれにせよ、この奇妙な動作をクリアしてくれたuser927524に感謝します!!

1
user3214451