Delphi FMX中如何获取ListView点击项绑定的idDrink字段
FMX ListView绑定SQLite后获取选中项的idDrink字段
我正在开发一款FMX应用,已经把ListView绑定到SQLite数据库的表上,所有饮品能正常加载到ListView,点击列表项时绑定字段显示正常。现在需要获取点击项对应的绑定字段idDrink,用来拼接所有配料字段并添加到Memo中。我偏好使用Visual Bindings,但部分操作需要代码实现,目前的代码如下:
procedure TForm2.lvDrinksListviewItemClick(const Sender: TObject; const AItem: TListViewItem); var idDrink: string; strDrinks: string; listviewindex: string; instructions: String; ingredients: String; begin qryDrinks.SQL.Text := 'select * From drinks '; qryDrinks.Open(); listviewindex := (TListViewItem(lvDrinksListview.Selected).Text); idDrink := qryDrinks.Fields[0].AsString; TListViewItem(lvDrinksListview.Selected).Text := listviewindex ; /// Here i need to set the idDrink to := the listview selected item instructions := qryDrinks.Fields[9].AsString; ingredients := qryDrinks.Fields[17].AsString + sLineBreak + qryDrinks.Fields [18].AsString + #13 + qryDrinks.Fields[19].AsString; showmessage(idDrink); showmessage((listviewindex)); Memo4.Lines.Add(ingredients); qryDrinks.Next; qryDrinks.Close(); TabControl1.ActiveTab := tiDrinksIngreediantsAndDirections; end;
解决方案
因为你用了Visual Bindings,ListView的每个Item其实已经和数据集的记录绑定了,不需要重新全表查询,直接通过绑定的数据集定位到选中项对应的记录即可。
方法1:利用绑定的数据集直接获取
如果你的ListView是通过TBindSourceDB绑定到qryDrinks,那么点击项时,数据集已经自动定位到对应的记录了,直接读取字段即可:
procedure TForm2.lvDrinksListviewItemClick(const Sender: TObject; const AItem: TListViewItem); var idDrink: string; ingredients: string; begin // 绑定关系已自动将qryDrinks定位到选中项对应的记录 idDrink := qryDrinks.FieldByName('idDrink').AsString; // 拼接配料字段,用FieldByName代替索引,可读性更强 ingredients := qryDrinks.FieldByName('strIngredient1').AsString + sLineBreak + qryDrinks.FieldByName('strIngredient2').AsString + sLineBreak + qryDrinks.FieldByName('strIngredient3').AsString; Memo4.Lines.Clear; Memo4.Lines.Add('配料:'); Memo4.Lines.Add(ingredients); Memo4.Lines.Add(sLineBreak + '制作步骤:'); Memo4.Lines.Add(qryDrinks.FieldByName('strInstructions').AsString); TabControl1.ActiveTab := tiDrinksIngreediantsAndDirections; end;
方法2:通过ListViewItem的TagString存储额外字段
如果绑定没有自动定位数据集,可以把idDrink存储到ListViewItem的TagString属性中:
- 打开Visual Bindings设计器
- 找到ListViewItem的绑定配置,将
idDrink字段绑定到TagString属性 - 点击事件中直接读取该属性:
procedure TForm2.lvDrinksListviewItemClick(const Sender: TObject; const AItem: TListViewItem); var idDrink: string; begin idDrink := AItem.TagString; // 用idDrink精准查询对应记录 qryDrinks.Close; qryDrinks.SQL.Text := 'SELECT strIngredient1, strIngredient2, strIngredient3, strInstructions FROM drinks WHERE idDrink = :id'; qryDrinks.ParamByName('id').AsString := idDrink; qryDrinks.Open; if not qryDrinks.Eof then begin Memo4.Lines.Clear; Memo4.Lines.Add('配料:'); Memo4.Lines.Add(qryDrinks.FieldByName('strIngredient1').AsString); Memo4.Lines.Add(qryDrinks.FieldByName('strIngredient2').AsString); Memo4.Lines.Add(qryDrinks.FieldByName('strIngredient3').AsString); Memo4.Lines.Add(sLineBreak + '制作步骤:'); Memo4.Lines.Add(qryDrinks.FieldByName('strInstructions').AsString); end; qryDrinks.Close; TabControl1.ActiveTab := tiDrinksIngreediantsAndDirections; end;
注意事项
- 避免使用
select *,只查询需要的字段,提升查询性能 - 优先用
FieldByName代替字段索引,避免因表结构变动导致代码出错,同时提升可读性 - 若使用Visual Bindings,优先利用绑定的自动定位机制,减少重复数据库查询操作
内容的提问来源于stack exchange,提问作者grant1842
相关产品推荐
相关产品推荐

