2017-01-21 8 views
-2

TDBGrid에서 선택한 행의 값을 검색하고 싶습니다. 어떻게하면됩니까?Delphi TDBGrid 선택된 행 값 가져 오기

procedure TForm7.Button2Click(Sender: TObject); 
    var 
     i, j: Integer; 
     s: string; 
    begin 
     if DBGrid1.SelectedRows.Count>0 then 
     with DBGrid1.DataSource.DataSet do 
      for i:=0 to DBGrid1.SelectedRows.Count-1 do 
      begin 
      GotoBookmark(DBGrid1.SelectedRows.Items[i]); 
      for j := 0 to FieldCount-1 do 
      begin 
       if (j>0) then s:=s+', '; 
       s := s + FindField(Fields.Fields[j].FieldName).AsString; 
      end; 
      Listbox1.Items.Add(s); 
      s:= ''; 
      end; 
    end; 
+0

무엇이 질문입니까? 각각의 선택된 행에 대해 변수's'를 명시 적으로 초기화하지 않는다는 점에서 명백한 문제가 있습니다 :'GotoBookmark ...'줄 다음에's : = '';'를 추가하십시오. – MartynA

답변

2

아래 코드는 몇 가지 문제를 해결합니다.

주요 문제는 사용자가 s을 올바르게 초기화하지 않았고 선택한 행의 필드를 가져 오는 방법에 결함이 있다는 사실이었습니다.

DataSet.Disable/EnableControlsListBox1.Items.BeginUpdate/EndUpdate을 호출하면 처리 속도가 빨라집니다.

또한 전염병과 같은 with 구조를 피하십시오. 보시다시피, 로컬 DataSet 변수를 사용하면 여분의 타이핑이 최소화되고 with을 사용할 때 발생할 수있는 모든 종류의 우발적 인 문제를 피할 수 있습니다.

procedure TForm1.GetSelected; 
var 
    i, 
    J : Integer; 
    s : String; 
    DataSet : TDataSet; 
begin 
    if DBGrid1.SelectedRows.Count>0 then begin 
    DataSet := DBGrid1.DataSource.DataSet; 
    // with DBGrid1.DataSource.DataSet do 
    try 
    ListBox1.Items.BeginUpdate; 
    DataSet.DisableControls; 
    for i:=0 to DBGrid1.SelectedRows.Count-1 do 
     begin 
     DataSet.GotoBookmark(Pointer(DBGrid1.SelectedRows.Items[i])); 
     s := ''; 
     for j := 0 to DataSet.FieldCount - 1 do 
     begin 
      if (j>0) then s:=s+', '; 
      s := s + DataSet.Fields[j].AsString; 
      //s := s + FindField(Fields.Fields[j].FieldName).AsString; 
     end; 
     Listbox1.Items.Add(s); 
     //s:= ''; 
     end; 
    finally 
     DataSet.EnableControls; 
     ListBox1.Items.EndUpdate; 
    end; 
    end; 
end; 

** 업데이트 : **

그리드의 선택된 행이 저장되는 2

DBGrid1.SelectedRows.CurrentRowSelected := True; 

업데이트 # 같은 선택으로 당신은 현재의 그리드 행을 설정할 수 있습니다

TBookmarkListSelectedRow에 있습니다. 현재 선택을 지우려면, 당신이 할 필요가있는과 같이, 그 Clear 메소드를 호출하는 것입니다

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

마찬가지로, 당신은 당신의 목록 상자를 취소하려는 경우, 당신은 그냥 같이 그 Clear 메소드를 호출

을 당신이 사용하려면 코드를 얻는 데 문제가있는 경우
procedure TForm1.btnClearListBoxClick(Sender: TObject); 
begin 
    ListBox1.Clear; 
end; 

,이 시도 :

Object Inspector에서
  1. 는, T에 DBGrid를 Options 속성 dgMultiSelect을 설정 후회.

  2. 버튼을 폼에 넣고 OnClick 처리기 호출 GetSelected에 넣습니다.

컴파일하고 실행하십시오. 그리드의 행을 클릭 한 다음 버튼을 클릭하십시오. 아무 반응이 없습니다. 그 이유는 버튼을 클릭하면 포커스가 DBGrid에서 멀리 이동하므로 걱정거리만큼 행이 선택되지 않기 때문입니다. 그런 다음 3 단계를 시도하십시오.

  1. 앱을 다시 실행하십시오. 이번에는 Ctrl 키를 누른 상태에서 그리드를 누른 다음 버튼을 누릅니다. 이번에는 선택된 행이 ListBox에 나타납니다. Ctrl 버튼이 계속 눌려진 상태에서 그리드의 다른 행을 클릭 한 다음 버튼을 클릭합니다. 이번에는 두 행이 모두 ListBox에 추가됩니다.
+0

불행하게도 선택된 행이 없지만 행을 선택하려면 몇 가지 속성을 활성화해야합니까? –

+0

작동하지 않습니다. 현재 그리드 행을 선택하는 방법은 업데이트를 참조하십시오. – MartynA

+0

하지만이 경우 : DBGrid1.SelectedRows.Count> 0이면 시작된 행을 찾지 못합니다. –