iT邦幫忙

0

C++ 對DBGrid直覺高效的選取資料列

c++ c
  • 分享至 

  • xImage
  •  

最近同仁要求在PDM系統增加一個功能,對業務洽辦單的單身資料可以一次性選取'組別'欄的有相同值的資料,例如凡'組別'為A1者選取,不然使用眼力+左手壓鍵盤Shift鍵+右手按壓滑鼠,一筆一筆佳選,實在費勁超沒效率。

程式完成了,但想若此功能不僅限’組別’欄而對任何欄位都一體適用豈不更佳,於是完成之。

(操作展示)

(本文)

函數的程式碼

// 檢查可否執行函數 dbg_multi_sel...()
bool can_do_dbg_multi_sel(TDBGrid *dg, bool show_msg)
{
  if(dg->Options.Contains(dgRowSelect)  == true  ||
     dg->Options.Contains(dgMultiSelect)== false
    ){
    if(show_msg==true){
      msg("此資料表單(DBGrid)的Options之dgRowSelect須為false 及 dgMultiSelect須為true才可執行\n\n  ("+(String)__FUNC__+")");
    }
    return false;
  }
  else
    return true;
}

//---------------------------------------------------------------------------
// 全選DBGrid的資料列
void dbg_multi_sel_all(TDBGrid *dg, int limited_qty)  //limited_qty:限制qu的筆數, 若大於此則不執行複選, 0則全不選         
{
  TDataSet *qu=dg->DataSource->DataSet;
  if(can_do_dbg_multi_sel(dg,true)==false){
    return;
  }
  else if(limited_qty<0){
    msg("函數參數limited_qty必須>=0\n\n  ("+(String)__FUNC__+")");
    return;
  }
  else if(limited_qty!=0 && limited_qty<qu->RecordCount){
    msg("此資料表單(DBGrid)的資料量 "+(String)qu->RecordCount+" 超過限制數量 "+(String)limited_qty+", 不可執行\n\n  ("+(String)__FUNC__+")");
    return;
  }
  else{
    for(qu->First();!qu->Eof;qu->Next()){
      if(limited_qty==0)  //清除全部
        dg->SelectedRows->CurrentRowSelected=false;
      else                //選取全部
        dg->SelectedRows->CurrentRowSelected=true;
    }
  }
}

// 複選DBGrid的資料列
void dbg_multi_sel(TDBGrid *dg, bool append)
{
  if(can_do_dbg_multi_sel(dg,true)==false){
    return;
  }
  TBookmark bk;
  TDataSet *qu=dg->DataSource->DataSet;
  String fld_name  = dg->SelectedField->FieldName;
  String fld_value = dg->SelectedField->Text.Trim();
  for(qu->First();!qu->Eof;qu->Next()){
    if(qu->FieldByName(fld_name)->Text.Trim()==fld_value){
      dg->SelectedRows->CurrentRowSelected=true;
      bk=qu->GetBookmark();
    }
    else{
      if(append==false)  //不累加
        dg->SelectedRows->CurrentRowSelected=false;
    }
  }
  qu->GotoBookmark(bk);
  qu->FreeBookmark(bk);
}
//---------------------------------------------------------------------------

PopnpMenu按鈕的程式碼:

void __fastcall TForm_Req::N21Click(TObject *Sender)
{
  // 全選, 限制若資料超過300筆則不執行
  TDBGrid *dbg=((TDBGrid *)ActiveControl);
  if(can_do_dbg_multi_sel(dbg, true)==true){
    dbg_multi_sel_all(dbg, 300);
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm_Req::N38Click(TObject *Sender)
{
  //複選(累加)
  TDBGrid *dbg=((TDBGrid *)ActiveControl);
  if(can_do_dbg_multi_sel(dbg, true)==true){
    dbg_multi_sel(dbg, true);
  }
}
//---------------------------------------------------------------------------

void __fastcall TForm_Req::N39Click(TObject *Sender)
{
  //複選(重新)
  TDBGrid *dbg=((TDBGrid *)ActiveControl);
  if(can_do_dbg_multi_sel(dbg, true)==true){
    dbg_multi_sel(dbg, false);
  }
}
//---------------------------------------------------------------------------

圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言