Есть ли способ оставить строку DataGridView выбранной, когда пользователь щелкает ячейку в другой строке? - PullRequest
2 голосов
/ 08 февраля 2011

Элемент управления DataGridView позволяет щелкать заголовки строк и выбирать строки (выделена вся строка) или использовать мышь и щелкать и перетаскивать, чтобы выбрать несколько строк, и т. Д., Чтобы выбрать все из них.*

В любом случае, мне нужно, чтобы строки оставались выделенными, если пользователь решит щелкнуть ячейку где-то в DataGridView.Таким образом, если пользователь щелкает ячейку в одной из выбранных строк, выделенные строки должны оставаться выделенными.Если пользователь щелкает ячейку в другой, невыбранной строке, все выделенные в данный момент ячейки должны оставаться выделенными.На самом деле, я не хочу, чтобы выбор строки изменился на всех , если только они не используют заголовки строк.

Это то, что легко настроить, или я занесколько дней взлома?

Ответы [ 3 ]

2 голосов
/ 08 февраля 2011

Не легко настроить. Потратьте несколько дней с элементом управления DataGridView, и вы заметите, что ничего об этом легко настроить, если только разработчики не решили представить его как свойство. И только самые простые вещи раскрываются таким образом, поэтому не тратьте слишком много времени на поиск.

Конечно, возможно . Я потратил слишком много своей жизни, подклассифицируя элемент управления DataGridView и переопределяя встроенное поведение, которое кажется мне глупым. Но я действительно никому не рекомендую.

Более того, вам также следует серьезно пересмотреть вопрос о том, хотите ли вы внести это конкретное изменение. Я понятия не имею, что происходит, если программное обеспечение начнет делать это. Я сразу заподозрил бы, что моя клавиша Shift или кнопка мыши застряли, и попытался отцепить их. Следующим шагом будет перезагрузка моего компьютера. В целом, не очень положительный пользовательский опыт. Это не способ, которым управление ведет себя по какой-то причине. Тщательно продумайте, что на самом деле означает семантически для подсвечиваемой ячейки - обычно подразумевается, что вы можете изменить значение или удалить все выбранные ячейки одновременно Если это не , как ваша реализация будет работать, вы, вероятно, не должны делать это в первую очередь.

2 голосов
/ 08 февраля 2011

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

Тем не менее, если вы заинтересованы в разработке этого проекта, то вам нужно будет сделать это самостоятельно.GridView не имеет встроенного поведения для этого.Вы можете поиграть с событиями RowChanged и свойствами CanSelect и выполнить некоторые переопределения.

А затем есть событие RowHeaderMouseClick , которое можно использовать для выбора строки из заголовка строки.

1 голос
/ 12 марта 2016

Мне удалось обойти это, используя ... Подклассы DataGridView, извините.

Это можно сделать аккуратно, добавив пару делегатов до и после внутреннего механизма, который их отменяет:

class SimpleDataGridView : DataGridView {

    public Action<DataGridViewCellMouseEventArgs> BeforeCellMouseDown;
    public Action<DataGridViewCellMouseEventArgs> AfterCellMouseDown;

    protected override void OnCellMouseDown(DataGridViewCellMouseEventArgs e) {
        if(BeforeCellMouseDown != null)
            BeforeCellMouseDown(e);

        base.OnCellMouseDown(e);

        if(AfterCellMouseDown != null)
            AfterCellMouseDown(e);
    }
}

Тогда вы можете использовать это в своем конструкторе. Замените «yourCondition» тем способом, которым вы хотите определить, должен ли выбор быть сохранен или нет.

IEnumerable<DataGridViewRow> sel = null;

dataGridView1.BeforeCellMouseDown = 
    e => {
        if (yourCondition)
            sel = dataGridView1.SelectedRows.OfType<DataGridViewRow>();
        else
            sel = null;
    };

dataGridView1.AfterCellMouseDown = 
    e => {
        if(sel != null) {
            foreach(var row in sel)
                row.Selected = true;
        }
    };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...