使用 LookupComboBox 时的注意事项(原创)

如果需要根据用户在 LookupComboBox 下拉列表中选择的行做后续处理,有以下几点需要注意:

  1. LookupCombobox 控件用于让用户在下拉列表中进行选择,不支持用户自行录入文字。将 DropDownListStyle 属性设置为 lsEditList,也只是允许用户在编辑框中输入下拉列表中不匹配的文字,但在提交时仍然要在下拉列表中查找是否有匹配值,而不会接受用户自行输入的文字??
  2. KeyFieldNames 属性决定的了控件的 EditValue,ListFieldIndex 决定了控件的 DisplayText。下面的示例中,LookupComboBox 列的 List Properties 的设置为:KeyFieldNames:Id; ListFieldIndex: PrdNo(商品代码)
  3. PostPopupValueOnTab 属性要设置为 True,此属性决定了按 Tab 键之后的行为。在cxGrid中,假设当前列的类型为 LookupComboBox,当根据用户输入查得结果并展开下拉列表,用户通过上下方向键选择一行后,按 Tab 键,如果此属性为 False,将不会更改 EditValue,直接将焦点移动到下一列;更严重的是,如果下一列的编辑类型也是下拉列表(哪怕是CalcEdit),则会把先前列的下拉列表带到下一列中导致混乱。因此,LookupComboBox 列的 PostPopupValueOnTab 属性必须设置为 True
  4. 一般来说,在其 EditValueChanged 事件中或 CloseUp 事件中写入处理代码的效果是差不多的,但是如果根据用户输入,无法查找到匹配项(下拉列表的行数为 0), 并移走输入焦点时,对于下面的代码,如果写在 EditValueChanged 事件中,自动清空输入的文字那行没有效果,会把未匹配到结果的关键字留在 LookupComboBox 列;写在 CloseUp 事件则会清空 LookupCombobox 中的关键字,因此最好在 CloseUp 事件中对用户选择进行处理。
procedure TfrmAddOrder.clPrdNoPropertiesCloseUp(Sender: TObject);
var
  strPrdNo, strName, strGuige, strDanwei: string;
  fPrice: Extended;
  Edit: TcxCustomEdit;
  id: Integer;
begin
  Edit := Sender as TcxCustomEdit;
  Edit.PostEditValue;
  if TcxLookUpComboBox(Sender).Properties.Grid.RowCount > 0 then begin
    // 根据输入值,查得匹配结果,下拉列表行数大于0
    //with TcxLookupComboBox(cvAddOrder.Controller.EditingController.Edit).Properties.Grid.DataController do begin
    with TcxLookupComboBox(Sender).Properties.Grid.DataController do begin
        // 取得下拉列表中当前行的各列数据
        id := GetKeyFieldsValues;
        strPrdNo := Values[FocusedRecordIndex, 0];
        strName := Values[FocusedRecordIndex, 1];
        fPrice := Values[FocusedRecordIndex, 2];
        if VarIsNull(Values[FocusedRecordIndex, 3]) then
          strGuige := ''
        else
          strGuige := Values[FocusedRecordIndex, 3];
        strDanwei := Values[FocusedRecordIndex, 4];

        // 写入 cxGrid 其他列
        //cvAddOrder.DataController.SetEditValue(clPrdNo.Index, strPrdNo, evsText);

        // LookupComboBox 列,设置 Value 也就决定了 DisplayText
        cvAddOrder.DataController.SetEditValue(clPrdNo.Index, id, evsValue);

        cvAddOrder.DataController.SetEditValue(clCaption.Index, strName, evsText);
        cvAddOrder.DataController.SetEditValue(clPrice.Index, fPrice, evsText);
        cvAddOrder.DataController.SetEditValue(clGuige.Index, strGuige, evsText);
        cvAddOrder.DataController.SetEditValue(clDanwei.Index, strDanwei, evsText);
        Calc(Sender);
        // 输入焦点移动到指定列
        clNumber.Editing := True;
    end;
  end else begin
    // 根据输入值,没有匹配结果,自动清空输入的文字
    //cvAddOrder.DataController.SetEditValue(clPrdNo.Index, '', evsText);
    cvAddOrder.DataController.SetEditValue(clPrdNo.Index, -1, evsValue);
  end;
end;
posted @ 2024-11-10 08:11  汉学  阅读(37)  评论(0)    收藏  举报