2016-04-19 17 views
3

私は、ユーザーがクリックしてプロセスのために複数選択するためのエントリのグリッドを持っています。エントリの一部は、最初に選択された行の値に基づいて無効になります。DBGrid:行が選択されないようにするにはどうすればいいですか?

私は約DBGrid.SelectedRows.CurrentRowSelectedを知っていますが、条件をTrueまたはFalseに設定するための適切な場所を見つけることができません。

このような何か:

var 
    bm: TBookmark; 
    CachedIdentity: String; 
    CanSelect: Boolean; 
begin 
    with dgbSkypeConversations do 
    begin 
    if SelectedRows.Count > 0 then 
    begin 
     DataSource.DataSet.DisableControls; 
     bm := DataSource.DataSet.GetBookmark; 
     CachedIdentity := DataSource.DataSet.FieldByName('identity').AsString; 
     DataSource.DataSet.GotoBookmark(SelectedRows[0]); 
     CanSelect := DataSource.DataSet.FieldByName('identity').AsString <> CachedIdentity; 
     DataSource.DataSet.GotoBookmark(bm); 
     DataSource.DataSet.FreeBookmark(bm); 
     SelectedRows.CurrentRowSelected := CanSelect; 
     DataSource.DataSet.EnableControls; 
    end; 
    end 
end; 

私はApplication.OnMessage中とのDBGridとフォームのOnMouseDownイベントを試してみましたが、彼らは動作しませんし、何TBookmarkList.BeforeInsertItemイベントはありません。私は何ができますか、または私は変更する必要がありますか?

+0

あなたの質問のタイトルは、Qのテキストで記述するものと一致していないようです。ユーザーがグリッド内のいくつかの行を選択しないようにしようとしていますか?そうであれば、最初の場所に表示されないようにしてください。グリッドのデータセットでフィルタを使用することによって? –

+0

最初の部分:はい。ユーザーがデータを見てから、何を選択するか決める前に...あなたが想像することができるすべてのフィルタを行ったが、ユーザーの要求を変更できない –

+0

ユーザーが最初の選択をしたらあなたが*無効にしたい*行)、フィルタリングして、適格でない行を削除することができます。これはUIの観点からはるかにクリーンです。ユーザーが特定の行を選択しないようにする方法をハッキングするかもしれませんが、その時点で、それらを無効にして(選択できない)ことを示すために別の行を描画することはできません。 –

答えて

1

私はそれが非常に複雑にしないでしょう。
比較が常に最初の選択で行われる場合。
ここで使用するコードにはValueがハードコードされています。
ブックマークにジャンプしません。

// first selection----------------------------- 
if DBGrid1.SelectedRows.Count = 1 then begin 
    CachedIdentity := 'Sonnenbrille'; // Sunglasses 
//CachedIdentity := DataSource.DataSet.FieldByName('identity').AsString; 
    Exit; 
end; 

我々は2を見ることができます

if DBGrid1.SelectedRows.CurrentRowSelected then begin 
//if CachedIdentity <> DataSource.DataSet.FieldByName('identity').AsString 
    if Pos(LookingFor,DBGrid1.DataSource.DataSet.FieldByName('haupttxt').AsString)=0 
    then DBGrid1.SelectedRows.CurrentRowSelected := False; 
    ShowMessage(IntToStr(DBGrid1.SelectedRows.Count)); 
end; 

比較を行いますので
ShowMessage(IntToStr(DBGrid1.SelectedRows.Count));

選択

enter image description here

示しています

今、私たちは)我々はSONNENBRILLE順位を(見つけることができるシンプルな順位()Sonnenbrilleを知っているラインに

SPORTLICH、ELEGANTE GUCCI SONNENBRILLE

を選択するには、= 0、その選択の意志になります起こらない。

enter image description here

ShowMessage(IntToStr(DBGrid1.SelectedRows.Count));

示しすぎ

CODE:

var 
CachedIdentity : string; 

procedure TForm2.canSelectedV1; 
begin 
    // first selection----------------------------- 
if DBGrid1.SelectedRows.Count = 1 then begin 
    CachedIdentity := 'Sonnenbrille'; // Sunglasses 
//CachedIdentity := DataSource.DataSet.FieldByName('identity').AsString; 
    Exit; 
end; 
if DBGrid1.SelectedRows.CurrentRowSelected then 
begin 
//if CachedIdentity <> DataSource.DataSet.FieldByName('identity').AsString 
    if Pos(LookingFor,DBGrid1.DataSource.DataSet.FieldByName('haupttxt').AsString)=0 
    then DBGrid1.SelectedRows.CurrentRowSelected := False; 
    ShowMessage(IntToStr(DBGrid1.SelectedRows.Count)); 
end; 
end; 

procedure TForm2.DBGrid1MouseUp(Sender: TObject; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Integer); 
begin 
canSelectedV1; 
end; 

procedure TForm2.DBGrid1KeyUp(Sender: TObject; var Key: Word; 
    Shift: TShiftState); 
begin 
canSelectedV1; 
end; 

end. 
+0

私はすでにブックマークの肥満をカットしていました。しかし、DBGRid KeyUPイベントとMouseUPイベントは、私が望むものの鍵でした。どうもありがとうございました。 –

+0

@JoséEduardo:喜んで助けることができます:-) –

2

TCustomDBGrid.MouseDownのソースを見ると、Mousedownイベントが発生したデータセット行(存在する場合)がどのように動作するかがわかります。あなたのグリッドのOnMouseUpイベントを設定し、念頭に置いて

if ssCtrl in Shift then 
    CurrentRowSelected := not CurrentRowSelected 

を、その中にブレークポイントを置く:あなたはまた、現在の行の選択状態につながるラインがトグルされて表示されます。

グリッドのMouseDownイベントで何が起こるかによって、OnMouseUpイベントが呼び出されるまでに、グリッドのデータセットの現在の行がクリックされたデータローに移動していることがわかります(下記を参照)。その時点で、現在の行がユーザーが選択できるようにする基準を満たしているかどうかをチェックし、そうでない場合は選択を解除することができます。私はあなたの特定の "行が選択されないようにする方法?"

ビヘイビアの選択を解除すると多少気になるので、おそらくユーザーに行が選択解除された理由を示す必要があります。

注:明らかに、グリッドのMousedownがデータセットのMoveByを呼び出すということは、データセットのOnScrollイベントが発生したことを意味します。あなたが何をしたいかによって、OnScrollイベントは、現在のデータローが選択基準を満たしているかどうかをチェックする場所となります。そうでない場合は、そこでの選択解除プロセスを開始します。いずれにしても、DBGrid.MouseDownイベントが呼び出されたデータローにデータセットが既に存在する必要があるという事実は、MouseUpでそれを識別する手間を省くはずです。

あなたが軌道に乗るには十分だろううまくいけば...

関連する問題