2011-11-07 8 views
1

DataGridViewのセルで複数のオブジェクトを許可することはできますか?DataGridViewはセル内に複数の「オブジェクト」を許可できますか?

グループを最初の列に表示し、その列の横の列に、そのグループに属するが1つのセル(グループ名の横のセル)にあるすべてのユーザーを表示したいとします。そして、私は各ユーザをクリックしてそれらをドラッグアンドドロップできる必要があるので、これは文字列操作ではありません。私はDataGridviewをSQLクエリデータベースにリンクして使用しています。私は、Visual Studio 2010

答えて

1

でのVisual Basicを使用しています

残念ながらあなたはDataGridViewの中でこれを行うことはできません。一度これを行う

GROUP USER 
------ ----- 

Group1 User1 
Group1 User2 
Group1 User3 
Group2 UserA 
Group2 UserB 

、その後、あなたはDataGridViewののCellFormattingイベントを処理し、マッチ上のセルのe.FormattedValue場合String.Emptyに値を設定することができます。ただし、このようになりますテーブルを作成することができます。次に、あなたのテーブルは次のように「見える」ようになります:

GROUP USER 
------ ----- 

Group1 User1 
     User2 
     User3 
Group2 UserA 
     UserB 

これはあなたが探しているものです。グリッド線を消したい場合は、代わりにDataGridViewのCellPaintingイベントを処理して、適切な罫線、テキストなどを描画することができます。

更新:CellFormattingイベントを使用してセルの内容を非表示にする例を次に示します。この例では、自分のデータソースとしてListを使用していますが、これをSQLデータソース、DataTableなどに置き換えることができます。

public partial class Form1 : Form 
{ 
    private List<GroupUserRow> _rows = new List<GroupUserRow>(); 

    public Form1() 
    { 
     InitializeComponent(); 

     _rows.Add(new GroupUserRow { Group = "Group1", User = "User1" }); 
     _rows.Add(new GroupUserRow { Group = "Group1", User = "User2" }); 
     _rows.Add(new GroupUserRow { Group = "Group1", User = "User3" }); 
     _rows.Add(new GroupUserRow { Group = "Group2", User = "UserA" }); 
     _rows.Add(new GroupUserRow { Group = "Group2", User = "UserB" }); 

     dataGridView1.DataSource = _rows; 
    } 

    private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
    { 
     if (e.RowIndex >= 0 && e.ColumnIndex == 0) 
     { 
      int prevRowIndex = e.RowIndex - 1; 
      if (prevRowIndex >= 0 && dataGridView1[0, prevRowIndex].Value == e.Value) 
      { 
       //this just "hides" the value from the screen, the value is not 
       //removed from the cell 
       e.Value = String.Empty; 
       e.FormattingApplied = true; 
      } 
     } 
    } 

    private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) 
    { 
     if (e.RowIndex >= 0 && e.ColumnIndex >= 0) 
     { 
      MessageBox.Show("This cell's value is: " + dataGridView1[e.ColumnIndex, e.RowIndex].Value); 
     } 
    } 

} 

public class GroupUserRow 
{ 
    public string Group { get; set; } 
    public string User { get; set; } 
} 
+0

ありがとうございました!しかし、私はこれを以前行いました。私は何をしましたか?私は各グループを配列に配置していましたが、配列にグループが既に含まれていればString = ""しかし、DGVはセルをクリックするたびに再描画されます。だから私はグループ名でセルをクリックすると、配列内にあるかどうかをチェックします。グループに入っていることがわかると、それは空に設定されます。セルをクリックするたびに、文字列は空に設定されます。何か案は?また、CellPaintingに関する詳しい説明は参考になります。ありがとう! =) –

+0

こんにちはジェームス!セルを隠すためにCellFormattingイベントを使用する例を追加しました。これがどうなるか教えてください! :-) –

+0

ちょっとケビン!迅速な応答ありがとう!これは確かに大いに助けになった!!今私が心配している1つの質問は、私はすでにanwserを知っている、私はString.Emptyに設定されているセルの行全体を持っている場合は、単に行を削除する方法はありますか?私は行が削除された後にSQLクエリのためのDGVに十分なスペースがないことを不満をデータベースに問題に実行されています。私は100人以上のユーザーがいる場合は特に審美的に魅力的ではないので、主に尋ねます。また、ドラッグドロップ機能を追加する際に私が邪魔になるかもしれません。ありがとう! =) –

関連する問題