database - wix 安装程序工具集中的 ComboBox 上的自定义操作删除/添加
问题描述
我有一个对话框(D1),它有一个 ComboBox,其中 ComboBox 的项目由自定义操作(C++ dll)填充。
UINT __stdcall FillComboBox(MSIHANDLE hInstall)
{
HRESULT hResult = WcaInitialize(hInstall, "FillComboBox");
if (FAILED(hResult)) return ERROR_INSTALL_FAILURE;
MSIHANDLE hTable = NULL;
MSIHANDLE hColumns = NULL;
hResult = WcaAddTempRecord(&hTable, &hColumns, L"ComboBox", NULL, 0, 3, L"COMBOBOXVALUES", 1, L"ABC");
hResult = WcaAddTempRecord(&hTable, &hColumns, L"ComboBox", NULL, 0, 3, L"COMBOBOXVALUES", 2, L"DEF");
hResult = WcaAddTempRecord(&hTable, &hColumns, L"ComboBox", NULL, 0, 3, L"COMBOBOXVALUES", 3, L"GHI");
}
当用户选择了一个项目时,下一个按钮被启用,并显示另一个对话框 (D2)(如果用户单击下一个按钮)和另一个组合框。D2 组合框也由自定义操作以与第一个相同的方式填充,但项目的选择基于在第一个对话框 (D1) 中选择的项目。
我的问题是,如果用户单击对话框 D2 中的后退按钮,并且在 D1 对话框中更改了组合框的选择,然后单击下一个按钮(要移回 D2),我想“重新加载”D2-ComboBox 中的项目使用在 D1 中选择的新值。
有没有办法从 c++ 代码中清除 msi 表?
我可以使用函数删除组合框表吗
MsiDatabaseOpenView(hDatabase, L"DELETE FROM 'ComboBox' WHERE 'Property' = 'COMBOBOXVALUES'", &hView)
解决方案
添加和删除组合框项的另一种方法是使用 DB 概念。您可以对 Table 编写 SQL 类型的查询进行直接操作。
HRESULT hResult = WcaInitialize(hInstall, "FillComboBox");
if (FAILED(hResult)) return ERROR_INSTALL_FAILURE;
MSIHANDLE hView = 0;
MSIHANDLE hDatabase = 0;
LPWSTR query;
query = L"INSERT INTO ComboBox (Property, `Order`, `Value`, `Text`) VALUES ('COMBOBOXVALUES', 1, 'Test', 'Test') TEMPORARY";
hDatabase = MsiGetActiveDatabase(hInstall);
hResult = MsiDatabaseOpenView(hDatabase, query, &hView);
if (hResult == ERROR_SUCCESS)
{
hResult = MsiViewExecute(hView, 0);
}
要删除表,您可以使用以下查询。
query = L"DELETE FROM ComboBox";
为了删除特定行,您需要执行以下查询。
query = L"DELETE FROM ComboBox WHERE `Order` = 1";
推荐阅读
- javascript - 仅显示 ReactJs 中 api 数据中的每 4 个项目
- html - React Material UI - 网格列高度属性
- c# - 使用 Android 应用程序操作日历事件
- go - 记录 http.ResponseWriter 内容
- javascript - Ionic/Capacitor iOS App 不会从第三方源加载脚本
- javascript - 如何在 JavaScript 中解析时间?
- python - 绘制从 xarray 数据集到 AxesGrid 的子图
- flutter - 使用令牌和云函数的最佳 FCM 方法
- prolog - 解释基本 Prolog 结果
- angular - 从 JAX-RS ContainerRequestFilter 重定向到 Angular 路由