web-dev-qa-db-ja.com

DataGridView列タイプをプログラムで定義する

実行時に列タイプを定義できる方法が必要です。

これが私のコードです:

foreach (DataGridViewColumn column in this.dataGrid.Columns)
{
???
//i.e. column.type  = checkbox
}

このforeachループで列タイプを定義するにはどうすればよいですか?

5
funerr

私はあなたの質問を100%確信していませんが、create the column:

foreach (var definition in columnDefinitions)  // Some list of what the column types are
{
    var columnSpec = new DataColumn
        {
            DataType = definition.Type, // This is of type System.Type
            ColumnName = defintion.Name // This is of type string
        };

    this.dataGrid.Columns.Add(columnSpec);
}

作成後にタイプを変更する必要がある場合は、それを行うことはできません。最善の方法は、列を削除して、新しいタイプで再作成することです。

8
ChrisF

あなたの例を考えれば、

foreach (DataGridViewColumn column in this.dataGrid.Columns)
{
    column.ValueType = typeof(DateTime);
}

ただし、datagridviewのすべての列を同じタイプにしたくないと仮定します。

this.datagrid.Columns[0].ValueType = typeof(Int32);
this.datagrid.Columns[1].ValueType = typeof(String);
this.datagrid.Columns[2].ValueType = typeof(DateTime);

これは、データソースを使用していて、プログラムで独自の列を追加しない場合に特に便利です。

6
user2107604

DataGridViewを作成するときのことだと思います。その場合、DataTableで定義し、dgvのデータソースに接続できます。

例えば:

var columns = new List<Tuple<string, string>>();
columns.Add(new Tuple<string, string>("Name", "System.String"));
columns.Add(new Tuple<string, string>("Selected", "System.Boolean"));
columns.Add(new Tuple<string, string>("Id", "System.Int32"));
var table = new DataTable();
columns.ForEach(c => table.Columns.Add(new DataColumn(c.Item1) { DataType = Type.GetType(c.Item2) }));
var dgv = new DataGridView();
dgv.DataSource = table;
2
David Wakeman

作成後にDataGridView列のタイプを変更することはできませんが、実行時に必要に応じて列の作成を停止することはできません。

したがって、各列のタイプを決定するロジックに応じて、必要に応じて列を作成し、DataGridViewに追加します。

チェックボックス列を作成する例を以下に示します。

DataGridViewCheckBoxColumn col = new DataGridViewCheckBoxColumn()
dataGridView1.Columns.Add(col);

列タイプを決定するものに関する詳細情報がなければ、これ以上アドバイスを与えることは困難ですが、DataTableでこの手法を簡単に使用したり、各列のタイプを調べたり、datagridviewをバインドしているオブジェクトのリフレクションを使用したりすることもできます。に。

2
David Hall

ボタン列も割り当てることができ、このようにプロパティを割り当てることもできます

    DataGridViewButtonColumn column = new DataGridViewButtonColumn();
    datagridview1.Columns.Add(column);
    column.FlatStyle = FlatStyle.System;
    column.DefaultCellStyle.ForeColor = Color.ForestGreen;          
1
Enigma State

BindingSourceを使用していると仮定します

var cbox = new DataGridViewCheckBoxColumn // Modify column type
{
    AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells,
    DataPropertyName = dgv.Columns["ColumnWantToChange"].Name, 
    HeaderText = "SOME HEADER NAME"
};
dgv.Columns.Add(cbox); // Add new 
var r = dgv.Columns.OfType<DataGridViewTextBoxColumn>().Where(x => x.Name == "ColumnWantToChange").FirstOrDefault();
dgv.Columns.Remove(r); // Remove the original column
0
Sourcephy