Может ли DataGridView разрешить более одного «объекта» в ячейке? - PullRequest
1 голос
/ 07 ноября 2011

Можно ли разрешить более одного объекта в ячейке в DataGridView?

Я хочу отобразить группу в первом столбце, а затем в столбце рядом с ним. Я хочу отобразить всех пользователей, которые находятся в этой группе, но в одной ячейке (ячейка рядом с именем группы),И это не может быть манипулированием строками, потому что мне нужно иметь возможность нажимать на каждого из пользователей и перетаскивать их.Я использую DataGridview, связанный с базой данных SQL-запросов.

Я использую Visual Basic с Visual Studio 2010.

1 Ответ

1 голос
/ 11 ноября 2011

К сожалению, вы не можете сделать это в DataGridView.Однако вы можете создать таблицу, которая будет выглядеть примерно так:

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

Group1  User1
Group1  User2
Group1  User3
Group2  UserA
Group2  UserB

После этого вы можете обработать событие CellFormatting объекта DataGridView и установить для e.FormattedValue значение String.Empty.если значение ячейки выше совпадает.Тогда ваш стол будет «выглядеть» следующим образом:

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

Group1  User1
        User2
        User3
Group2  UserA
        UserB

Это в значительной степени то, что вы ищете.Если вы хотите, чтобы линии сетки исчезли, вы можете вместо этого обработать событие DataGridView CellPainting, чтобы нарисовать правильные границы, центральный текст и т. Д.

ОБНОВЛЕНИЕ: Вот пример использования события CellFormatting, чтобы скрыть содержимоеклетка.В этом примере я просто использую список в качестве источника данных, но вы можете заменить его источником данных SQL, таблицей данных и т. Д.

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; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...