Пользовательское действие Удалить / Добавить в ComboBox в wix Installer Toolset - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть диалог (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.

Есть ли способ очистить таблицу MSI из кода C ++?

Можно ли удалить таблицу со списком, используя функцию

MsiDatabaseOpenView(hDatabase, L"DELETE FROM 'ComboBox' WHERE 'Property' = 'COMBOBOXVALUES'", &hView)

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Альтернативный способ добавить и удалить элемент комбинированного списка - использовать концепцию БД.Вы можете выполнять прямые операции над таблицей при написании 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";
0 голосов
/ 27 ноября 2018

Рассматривали ли вы использование свойства для сохранения и совместного использования значений в полях со списком?

...