2009-05-12 15 views
8

私は3つのフィールド "Foo"、 "Bar"、 "Baz"を持つDataTableに10レコードのデータを持っています。DataGridviewの行と列を切り替えることはできますか?

これをDataGridViewに接続すると、10行と3列が表示され、列ヘッダーにはフィールドの名前が表示されます。

行と列を逆にして、同じデータで3行10列になり、行ヘッダーにフィールド名が表示されるようにするのは簡単です。


私はのOnPaintメソッドをオーバーライドし、行ヘッダーセルに直接フィールド名を描くように、てmanualyいくつかのことを行うことができますが、私は、より自動化された何かを探しています。

また、値を手動で入れ替えることの提案がありますが、すべての値のStringを作成しない限り、これは機能しません。データテーブルの3つの列 - int型、float型、およびstring型のFoo、Bar、およびBazは転置されません。

これらの手動変更をすべて管理したとしても、データグリッドにはCheckBox列、ComboBox列があります。そのような行は存在しません。CheckBox行またはComboBox行はありません。私は現在、コンパイラに「ComboBoxColumnを追加する」と指示するだけで、すべてのセルが個別に生成されるように書き直す必要があります。

理想的には、DataGridViewのすべての機能を公開したTransposableDataGridViewと、追加のboolプロパティ「Transposed」が必要です。そうすれば、すべてのコードをそのままそのまま残すことができます。グリッドのタイプ以外は何も変更する必要はありません。

このようなことがなければ、私は行かなくてはならないかもしれません。 :)

答えて

1

これは、必要な列の数をプログラムで追加して(たとえば、7つ以上を10にして)、行、列、列、行をプログラムでスワップすることによって行うことができます。

+0

DataTableまたはDataGridViewに列を追加することをお勧めしますか? –

5

新しいDataTableを作成し、適切な数の列を追加して、あるテーブルから別のテーブルに値をコピーして、行と列を交換することができます。

列ヘッダーを設定するのと同じ方法で行ヘッダーを設定することはできません(少なくとも、わからない)ので、フィールド名を別の列に入れることができます。

DataTable oldTable = new DataTable(); 

... 

DataTable newTable = new DataTable(); 

newTable.Columns.Add("Field Name"); 
for (int i = 0; i < oldTable.Rows.Count; i++) 
    newTable.Columns.Add(); 

for (int i = 0; i < oldTable.Columns.Count; i++) 
{ 
    DataRow newRow = newTable.NewRow(); 

    newRow[0] = oldTable.Columns[i].Caption; 
    for (int j = 0; j < oldTable.Rows.Count; j++) 
     newRow[j+1] = oldTable.Rows[j][i]; 
    newTable.Rows.Add(newRow); 
} 

dataGridView.DataSource = newTable; 
+0

答えをありがとう - 私はbool DataColumnと文字列を持っている場合どうなりますか?DataColumn - どのタイプの転置グリッドの列を作成しますか? –

+0

タイプを設定しない場合は、デフォルトでstringになるので、他のタイプの値は自動的に変換されるため、ユーザーに適切なデータを表示したい場合にのみ使用してください。もう1つの方法は、型をオブジェクトに設定することです。この型の変数には何も含めることができます。 – svick

2

を望む結果を得ることができ、私は開発EXPRESを使用して操作を行う必要があります垂直グリッド .. これは、回転グリッドが必要なようです。 これは、行ごとに異なるエディターを使用することもできます。私の場合は

Link to vertical grid product page

0

新しいテーブルのすべての列に名前を追加することも必要。

static public DataTable Transpose(DataTable inputTable, List<string> newColumnNames) 
{ 
    DataTable outputTable = new DataTable(); 

    ///You should also verify if newColumnsNames.Count matches inputTable number of row 

    //Creates the columns, using the provided column names. 
    foreach (var newColumnName in newColumnNames) 
    { 
     outputTable.Columns.Add(newColumnName, typeof(string)); 
    } 

    foreach (DataColumn inputColumn in inputTable.Columns) 
    { 
     //For each old column we generate a row in the new table 
     DataRow newRow = outputTable.NewRow(); 

     //Looks in the former header row to fill in the first column 
     newRow[0] = inputColumn.ColumnName.ToString(); 

     int counter = 1; 
     foreach (DataRow row in inputTable.Rows) 
     { 
      newRow[counter] = row[inputColumn.ColumnName].ToString(); 
      counter++; 
     } 
     outputTable.Rows.Add(newRow); 
    } 

    return outputTable; 

} 
関連する問題