Пользовательская проблема DataGridViewRow - PullRequest
2 голосов
/ 19 июля 2011

Я пытаюсь создать пользовательский DataGridViewRow, который будет действовать как разделитель (для разделения данных на группы).Я сделал это, переопределив метод PainCells в классе DataGridViewRow следующим образом:

protected override void PaintCells(Graphics graphics, Rectangle clipBounds, Rectangle rowBounds, int rowIndex, DataGridViewElementStates rowState, bool isFirstDisplayedRow, bool isLastVisibleRow, DataGridViewPaintParts paintParts)
    {  
        graphics.FillRectangle(new SolidBrush(BackgroundColor),rowBounds);

        StringFormat format = new StringFormat {Alignment = StringAlignment.Center,LineAlignment = StringAlignment.Center};
        graphics.DrawString(Text, this.DataGridView.Font, new SolidBrush(ForeColor), rowBounds,format);
    }

Где Text, BackgroundColor и ForeColor являются свойствами моего класса SeparatorDataGridViewRow.Строки выглядят так, как я хотел.Но это только «крышка», потому что под нарисованным прямоугольником все еще есть оригинальные ячейки данных.В частности, ячейка с кнопкой удаления формы DataGridViewButtonColumn, которую я добавил.И из-за этого, если я нажму на ячейку, где находится кнопка, моя строка-разделитель будет удалена.

Я не думаю, что это правильный способ достичь того, чего я хочу достичь, поэтому я был бы рад, если бы вы, ребята, могли либопокажи мне правильное направление или расскажи, что я могу сделать с этим решением, чтобы заблокировать возможность пользователю что-либо делать с этой строкой, независимо от того, что находится «под нарисованным прямоугольником».

У меня мало опыта в создании пользовательских элементов управленияпоэтому я не знаю, какие методы переопределить или что добавить для достижения определенных целей.Любая помощь приветствуется:)

1 Ответ

0 голосов
/ 22 июля 2011

Хорошо, я частично решил свою проблему. Я не знаю, является ли это решение хорошим, и оно приносит другую проблему, которая является для меня загадкой.

В моем SeparatorDataGridViewRow я установил для тега значение «Разделитель». Затем я создал свой собственный элемент управления DataGridView, в котором я переопределил метод OnUserDeletingRow:

    protected override void OnUserDeletingRow(DataGridViewRowCancelEventArgs e)
    {
        if (e.Row.Tag != null && e.Row.Tag.ToString().Equals("Separator"))
        {
            e.Cancel = true;
            return;
        }
        base.OnUserDeletingRow(e);
    }

Таким образом, моя строка Разделителя не может быть удалена пользователем. Но сейчас происходят странные вещи. У меня есть DataGridView, как это:

enter image description here

Когда я выбираю строку с именем «2» и удаляю ее, все отлично работает:

enter image description here

И это работает со всеми строками. НО, если я выберу любую из строк Разделителя и нажму Удалить, она не будет удалена, но если затем я удалю любую из строк над ней, это произойдет:

enter image description here

В этом случае я выбрал Разделитель 2, а затем удалил строку с именем «2». Это странно, потому что фактическая строка удаляется, а выбранная строка фактически является строкой Separator2. Это какая-то проблема с краской. Но я не знаю, почему это происходит только тогда, когда я «пытаюсь» удалить разделитель строк раньше. Что изменится в процессе рисования, когда я пытаюсь удалить строку разделителя перед удалением любого из вышеперечисленного?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...