TreeView和ListView資料庫查詢資料聯動操作
阿新 • • 發佈:2021-06-30
好久不用了,重新整理下放這裡以備需要使用,功能見圖
定義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;