안녕하세요.
그리드에서 검색 후 불려온 데이터에 대해서
전체 검색을 하려고 하는데....
필드 하나에서는 검색이 가능 하지만
전체 필드에 대해서 검색을 하려면... 어떻게 해야 하는지??
그렇다구 각 필드 마다 전부다 검색을 할 수는 없자나요.
찾아 보니 시간이 오래걸린다고 하는데...
예를 들면 성명, 나이, 사번, 지역 등등 각각의 Edit 를 만들어 검색시 사용한다고 보시면 되요.
이걸 통합해서 검색 된 그리드의 내용 중(DB에서 검색한 데이터)에서
내가 32라는 값을 입력 하여 그리드의 내용을 조회 하면 성명, 나이, 사번, 지역에 상관없이
그리드의 모든 필드 값을 검색 하려고 합니다.
검색관련 함수나 좋은 방법이 있으시면 알려주세요.
(그리드에 뿌려진, 그리드가 가지고 있는 데이터를 가지고 검색을 하는 겁니다,)
현재는 검색을 할때는 필드 별로 따로 입력을 받아 검색을 합니다. 아래 소스 입니다.
<!--CodeS-->
for I := Position + 1 to grd.RowCount - 1 do begin
if POS(UpperCase(SearchData), UpperCase(grd.Cells[AColumn,I].AsString)) <> 0 then begin
grd.Row := I;
exit;
end;
end;
<!--CodeE-->
전부다 검색을 하셔야 하구요.. 많은 양의 레코드를 그리드에 뿌리셨다면 검색속도는 느려짐을 감수하셔야 할듯..
아래 코드를 참고 하세요...
function FindTextForStringGrid(StringGrid: TStringGrid; const Text: string): Integer;
function FindText(StringGrid: TStringGrid; const Text: string): Integer;
// Result: if found Text returns RowIndex, else returns -1
var
ColIndex, RowIndex: Integer;
begin
Result := -1;
for RowIndex := 0 to StringGrid.RowCount - 1 do
begin
for ColIndex := 0 to StringGrid.ColCount - 1 do
begin
if Pos(StringGrid.Cells[ColIndex, RowIndex], Text) <> 0 then // Found
begin
Result := RowIndex;
Exit;
end;
end;
end;
end;
var
RowIndex: Integer;
TopRowIndex: Integer;
SelRect: TGridRect;
begin
RowIndex := FindText(StringGrid, Text);
if RowIndex <> -1 then
begin
TopRowIndex := RowIndex - StringGrid.VisibleRowCount + StringGrid.FixedRows;
if TopRowIndex < StringGrid.FixedRows then
TopRowIndex := StringGrid.FixedRows;
StringGrid.TopRow := TopRowIndex;
SelRect.Left := 0;
SelRect.Top := RowIndex;
SelRect.Right := StringGrid.ColCount;
SelRect.Bottom := RowIndex;
StringGrid.Selection := SelRect;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
FindTextForStringGrid(StringGrid1, '홍길동');
end;