2017-01-28 22 views
4

Использование SelectedRows.Count Я могу получить количество выбранных строк сетки. Например, если пользователь выбрал 3 строки, я могу поместить кнопку в форму и щелкнуть, чтобы показать мне выбранный номер. Хорошо.Delphi Grid: Как получить selectrows count "на лету"

Но как я могу обновить количество строк, когда пользователь их выбирает («на лету»). Я пробовал многие из Grid событий, например OnColEnter или OnMouseDown. Кажется, они обновляют счетчик только тогда, когда пользователь щелкает за пределами столбцов данных, а не когда выбирается строка.

Не видя событий, связанных с изменением ROWS в компоненте Grid, я пробовал много событий в базовом запросе данных, но они также были непоследовательными или часто требовали нажатия в определенных местах. Лучший результат я нашел (фактический код) был после прокрутки запроса:

procedure TDataHerd10.QuCowsAfterScroll(DataSet: TDataSet); 
begin 
    if MenuOpt = 'UpdtInd' then MainView.NumSelEdit.Text:= 
    IntToStr(MainView.CowSelGrid.SelectedRows.Count); 
end; 

Это событие кажется лаг один позади, и добавляет еще один к графу первоначально, когда пользователь покидает MULTISELECT, чтобы вернуться к одному ряд.

Кажется, что с правильным событием я должен уметь подсчитывать выбранные строки для отчета пользователю, когда они выбирают/отменяет выбор строк?

+0

Пробовал ли вы событие 'OnClick()'? Обычно это нормальное событие для большинства элементов управления. В некоторых элементах управления это также срабатывает в случаях, которые на самом деле не являются кликом, например, с помощью прокрутки со списком клавиш вверх/вниз. Кроме того, я думаю, вы должны изменить название своего вопроса на «Data Grid» или «TDBGrid», потому что я получил большую часть вашего вопроса, думая, что это «TStringGrid», о котором вы говорили, а затем пришлось повторно -прочитайте его как 'TDBGrid'. –

+1

Кроме того, вам может быть полезно использовать флажки. Я не могу вспомнить последнее приложение, которое я использовал, когда мне нужно было держать управление или переключиться на мультивыбор. Помимо древнего кода я получил один раз, который я действительно переписал, чтобы использовать флажки. –

+3

@Jerry: Um ... Проводник Windows? Перспективы? Excel? Вы не можете вспомнить, используя какие-либо из них (все из которых являются приложениями, для которых требуется сочетание клавиш Ctrl или Shift). Есть миллионы корпоративных пользователей Windows 7, которые не согласятся с тем, что вы написали. –

ответ

3

Update: Я нашел, что это сложнее, чем я ожидал, чтобы изменить свой первоначальный ответ надежно удовлетворить ваши требования, чтобы иметь выберите количество отображается когда форма первых концертов.

Ниже приведены основы тестового проекта, который, я надеюсь, надежно ведет , как вы просили. В дополнение к DBGrid форма имеет TEdit, который я использую , чтобы гарантировать, что dbgrid изначально не сфокусирован (чтобы было легче наблюдать поведение dbgrid) и 3 TButtons, функции должны быть очевидны из их обработчики OnClick.

Вы заметите, что код, который ловит меняющийся счетчик подсчета выбора в DBGrid является срабатывают только в OnDrawColumnCell события DBGrid в. Тем не менее, это называется слишком часто (в моем случае более 700 раз перед тем, как форма сначала отображается), чтобы делать что-то еще в gui при каждом его запуске. Таким образом, вместо этого форма имеет переменную , которая отслеживает счетчик выборки и обновляет ее только при изменении счета (в Set SetelectedCount setter).

type 
    TForm1 = class(TForm) 
    [...] 
    private 
    FSelectedCount: Integer; 
    procedure SetSelectedCount(const Value: Integer); 
    public 
    procedure ShowSelectedCount; 
    property SelectedCount : Integer read FSelectedCount write SetSelectedCount; 
    end; 
[...] 

procedure TForm1.btnClearSelectedClick(Sender: TObject); 
begin 
    DBGrid1.SelectedRows.Clear; 
end; 

procedure TForm1.btnGetSelectedClick(Sender: TObject); 
begin 
    ShowSelectedCount; 
end; 

procedure TForm1.btnSetSelectedClick(Sender: TObject); 
begin 
    DBGrid1.SelectedRows.CurrentRowSelected := True; 
end; 

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; 
    DataCol: Integer; Column: TColumn; State: TGridDrawState); 
begin 
    SelectedCount := DBGrid1.SelectedRows.Count; 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    ActiveControl := Edit1; // so the grid does not have focus when the form is first shown 
    SelectedCount := -1; 
end; 

procedure TForm1.SetSelectedCount(const Value: Integer); 
begin 
    if FSelectedCount <> Value then begin 
    FSelectedCount := Value; 
    ShowSelectedCount; 
    end; 
end; 

procedure TForm1.ShowSelectedCount; 
begin 
    Caption := IntToStr(DBGrid1.SelectedRows.Count); 
end; 

Оригинальный ответ следует

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

К сожалению,

procedure TForm1.DBGrid1CellClick(Column: TColumn); 
begin 
    Caption := IntToStr(DBGrid1.SelectedRows.Count); 
end; 

не совсем делать работу, либо, по довольно очевидной причине, что вы можете расширить выбор из текущей строки без использования мыши - например, Shift + Вниз сделают это тоже.

Однако, если вы просто добавить

procedure TForm1.DBGrid1KeyUp(Sender: TObject; var Key: Word; Shift: 
    TShiftState); 
begin 
    Caption := IntToStr(DBGrid1.SelectedRows.Count); 
end; 

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

Btw, принимая клавиатуру морщин, а также проблему с AfterScroll во внимание, ваш q, похоже, не заслуживает (для меня, во всяком случае) нисходящего потока, он получил, поэтому я дал ему +1.

+0

Отлично, с DBGrid1KeyUp! Я также могу добавить, что комментарий от @Jerry Doidge по созданию собственного столбца флажка - хорошая идея, чтобы сделать его более удобным для пользователя и быть более «в стиле», когда я попаду на платформу без окон (позже). –

+0

На самом деле, @ScottStalheim, я собираюсь опубликовать обновление для своего ответа, в котором показан альтернативный метод, который я предпочитаю, потому что для этого требуется только один сайт. – MartynA

+0

Большое спасибо за подробную помощь, @Martyn. Теперь я хорошо его работаю. Ваше размещение кнопки для «ShowSelectedCount» было чем-то, что я уже делал для целей тестирования, но, чтобы быть ясным, требование опубликовать номер, выбранный «на лету», означает, что вам не нужно нажимать кнопку, чтобы увидеть счет обновлено. –

0

Добавление еще немного отличный ответ от @Martyn ...

Для того, чтобы автоматически обновлять отображаемый счетчик («на лету»), я нашел предложение использовать Grid1.KeyUp обновить количество очень хорошо, но также добавил обновление счета на пару других событий. Наиболее критичным был Grid1.MouseUp. Без этого пользователь может щелкнуть по новой строке за пределами выбранных строк и потерять все выборки строк, НО отображаемый счетчик останется, а не вернется к нулю.

 Смежные вопросы

  • Нет связанных вопросов^_^