我有一个对话框(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)
答案 0 :(得分:0)
您是否考虑过使用属性在组合框中保留和共享值?
答案 1 :(得分:0)
添加和删除组合框项目的另一种方法是使用数据库概念。 您可以对编写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";