使用 LookupComboBox 时的注意事项(原创)
如果需要根据用户在 LookupComboBox 下拉列表中选择的行做后续处理,有以下几点需要注意:
- LookupCombobox 控件用于让用户在下拉列表中进行选择,不支持用户自行录入文字。将 DropDownListStyle 属性设置为 lsEditList,也只是允许用户在编辑框中输入下拉列表中不匹配的文字,但在提交时仍然要在下拉列表中查找是否有匹配值,而不会接受用户自行输入的文字??
- KeyFieldNames 属性决定的了控件的 EditValue,ListFieldIndex 决定了控件的 DisplayText。下面的示例中,LookupComboBox 列的 List Properties 的设置为:KeyFieldNames:Id; ListFieldIndex: PrdNo(商品代码)
- PostPopupValueOnTab 属性要设置为 True,此属性决定了按 Tab 键之后的行为。在cxGrid中,假设当前列的类型为 LookupComboBox,当根据用户输入查得结果并展开下拉列表,用户通过上下方向键选择一行后,按 Tab 键,如果此属性为 False,将不会更改 EditValue,直接将焦点移动到下一列;更严重的是,如果下一列的编辑类型也是下拉列表(哪怕是CalcEdit),则会把先前列的下拉列表带到下一列中导致混乱。因此,LookupComboBox 列的 PostPopupValueOnTab 属性必须设置为 True
- 一般来说,在其 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;

浙公网安备 33010602011771号