1. 程式人生 > 其它 >TreeView和ListView資料庫查詢資料聯動操作

TreeView和ListView資料庫查詢資料聯動操作

好久不用了,重新整理下放這裡以備需要使用,功能見圖

定義TreeView addObject中data儲存的記錄集

type
  PNode = ^TNode;

  TNode = record
    id: Integer;
    tcmc: string;
    mxid: string;
  end;

填充TreeView程式碼

procedure TForm1.FillTree(TreeView: TTreeView);
var
  findq: TADOQuery;
  node: TTreeNode;
  p: PNode;
  //這個方法是根據記錄的id欄位值,查詢TreeView上的父節點
function FindParentNode(id: Integer): TTreeNode; var i: Integer; begin Result := nil; for i := 0 to TreeView.Items.Count - 1 do begin //比較Node的Data值和記錄的id值 if Integer(PNode(TreeView.Items[i].Data).id) = id then begin Result := TreeView.Items[i]; Break;
end; end; end; begin findq := TADOQuery.Create(nil); findq.ConnectionString := 'Provider=SQLOLEDB.1;Password=szzx@123456;Persist Security Info=True;User ID=p_admin;Initial Catalog=dd;Data Source=172.16.1.212'; try TreeView.Items.BeginUpdate; TreeView.Items.Clear; findq.SQL.Text :
= 'SELECT c.id,c.tcmc,c.pid,c.mxid FROM 處方套餐 AS c WITH(NOLOCK) ORDER BY c.id'; findq.Open; while not findq.Eof do begin //將資料放入結構體以便雙擊時使用 New(p); p.id := findq.FieldByName('id').AsInteger; p.tcmc := findq.FieldByName('tcmc').AsString; p.mxid := findq.FieldByName('mxid').AsString; //如果是最頂級,直接新增到TreeView if findq.FieldByName('pid').AsInteger = 0 then //將導航樹儲存在Node的Data中,以便查詢用 TreeView.Items.AddObject(nil, findq.FieldByName('tcmc').AsString, TObject(p)) else begin //查詢上級節點,存在上級節點新增子節點 node := FindParentNode(findq.FieldByName('pid').AsInteger); if node <> nil then TreeView.Items.AddChildObject(node, findq.FieldByName('tcmc').AsString, TObject(p)); end; findq.Next; end; finally findq.Free; TreeView.FullExpand; //展開樹 TreeView.Items.EndUpdate; end; end;

查詢資料呼叫程式碼

procedure TForm1.Button1Click(Sender: TObject);
begin
  FillTree(TreeView1);
end;

雙擊TreeView填充ListView

procedure TForm1.TreeView1DblClick(Sender: TObject);
var
  mxid: string;
  str: TStrings;
  I: Integer;
  strSql: TStrings;
  QryTemp: TADOQuery;
begin
  if not TreeView1.Selected.HasChildren then      //當前選中是否含有子項,如果有則展開不執行操作
  begin
    str := TStringList.Create;
    strSql := TStringList.Create;
    QryTemp := TADOQuery.Create(Self);
    try
      QryTemp.ConnectionString := 'Provider=SQLOLEDB.1;Password=szzx@123456;Persist Security Info=True;User ID=p_admin;Initial Catalog=dd;Data Source=172.16.1.212';
      //mxid值:107,108,109,110,111,112
      mxid := PNode(TreeView1.Items[TreeView1.Selected.AbsoluteIndex].Data).mxid;
      //根據分割符號新增mxid到StringList
      str.Delimiter := ',';
      str.DelimitedText := mxid;
      //查詢資料
      strSql.Clear;
      strSql.Add('SELECT a.DiagnosisProjectID, a.DiagnosisProjectName');
      strSql.Add('FROM   DDDiagnosisProject AS a WITH(NOLOCK) ');
      strSql.Add('WHERE a.DiagnosisProjectID=' + QuotedStr(str[0]));
      for I := 1 to str.Count - 1 do
      begin
        strSql.Add('      OR a.DiagnosisProjectID=' + QuotedStr(str[I]));
      end;
      strSql.Add('ORDER BY a.DiagnosisProjectID');
      with QryTemp do
      begin
        Close;
        SQL.Text := strSql.Text;
        Open;
      end;
      //查詢存在資料就新增資料到ListView
      if QryTemp.RecordCount > 0 then
      begin
        QryTemp.First;
        ListView1.Items.Clear;
        while not QryTemp.Eof do
        begin
          with ListView1.Items.Add do
          begin
            Caption := QryTemp.FieldByName('DiagnosisProjectID').AsString;
            SubItems.Add(QryTemp.FieldByName('DiagnosisProjectName').AsString);
          end;
          QryTemp.Next;
        end;
      end;
    finally
      str.Free;
      strSql.Free;
      QryTemp.Free;
    end;
  end;
end;

點選ListView點選行選中CheckBox

procedure TForm1.ListView1Click(Sender: TObject);
begin
  ListView1.Items[ListView1.Selected.Index].Checked := not ListView1.Items[ListView1.Selected.Index].Checked;
end;

ListView全選

procedure TForm1.btnSelectAllClick(Sender: TObject);
var
  I: Integer;
begin
  for I := 0 to ListView1.Items.Count - 1 do
  begin
    ListView1.Items[I].Checked := True;
  end;
end;

ListView取消選中

procedure TForm1.btnClearSelectClick(Sender: TObject);
var
  I: Integer;
begin
  for I := 0 to ListView1.Items.Count - 1 do
  begin
    ListView1.Items[I].Checked := False;
  end;
end;

ListView反選

procedure TForm1.btnUnSelectClick(Sender: TObject);
var
  I: Integer;
begin
  for I := 0 to ListView1.Items.Count - 1 do
  begin
    ListView1.Items[I].Checked := not ListView1.Items[I].Checked;
  end;
end;

檢視ListView選中項

procedure TForm1.btnAllCheckedClick(Sender: TObject);
var
  i: Integer;
  s: string;
begin
  Memo1.Clear;
  for i := 0 to ListView1.Items.Count - 1 do
  begin
    if ListView1.Items[i].Checked then
    begin
      s := s + ListView1.Items[i].Caption + ':' + ListView1.Items[i].SubItems[0] + #13#10;
    end;
  end;
  Memo1.Text := s;
end;

TreeView ListView操作聯動示例程式碼