DataGridView可以在单元格中允许多个“对象”吗?

时间:2011-11-07 17:00:56

标签: vb.net winforms datagridview

是否可以在DataGridView的单元格中允许多个对象?

我想在第一列中显示一个Group,然后在它旁边的列中显示我想要显示该组中但在一个单元格中的所有用户(组名旁边的单元格)。这不能是字符串操作,因为我需要能够点击每个用户并拖放它们。我正在使用DataGridview链接到SQL查询数据库。

我在Visual Studio 2010中使用Visual Basic。

1 个答案:

答案 0 :(得分:1)

不幸的是,你无法在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; }
}