Как мне заполнить ComboBox во время установки в WiX?
Редактировать: яобновил код ниже, чтобы он теперь работал, благодаря РобуС ответом. Я
нашел пару страниц, которые показывают, как это сделать (http://www.cmcrossroads.com/content/view/13160/120/,http://www.mail-archive.com/[email protected]/msg05103.html) и просмотрел исходный код WAI (http://wai.codeplex.com/), Но я могу'Кажется, он работает в моем инсталляторе независимо от того, что я пытаюсь. Если кто-нибудь может определить, что яя делаю не такБуду очень признателен. Мой фрагмент WiX для диалога выглядит так:
...snip...
...snip...
Dummy
Мой код пользовательского действия:
[CustomAction]
public static ActionResult FillWebsiteNameList(Session xiSession)
{
xiSession.Log("Begin FillWebsiteNameList");
xiSession.Log("Opening view");
View lView = xiSession.Database.OpenView("SELECT * FROM ComboBox");
lView.Execute();
xiSession.Log("Creating directory entry");
DirectoryEntry lIis = new DirectoryEntry("IIS://localhost/w3svc");
xiSession.Log("Checking each child entry");
int lIndex = 1;
foreach (DirectoryEntry lEntry in lIis.Children)
{
if (lEntry.SchemaClassName == "IIsWebServer")
{
xiSession.Log("Found web server entry: " + lEntry.Name);
string lWebsiteName = (string)lEntry.Properties["ServerComment"].Value;
xiSession.Log("Website name: " + lWebsiteName);
xiSession.Log("Creating record");
Record lRecord = xiSession.Database.CreateRecord(4);
xiSession.Log("Setting record details");
lRecord.SetString(1, "IIS_WEBSITENAME");
lRecord.SetInteger(2, lIndex);
lRecord.SetString(3, lEntry.Name); // Use lWebsiteName only if you want to look up the site by name.
lRecord.SetString(4, lWebsiteName);
xiSession.Log("Adding record");
lView.Modify(ViewModifyMode.InsertTemporary, lRecord);
++lIndex;
}
}
xiSession.Log("Closing view");
lView.Close();
xiSession.Log("Return success");
return ActionResult.Success;
}
Раньше было две проблемы:
1) Приведенный выше код не удался во время выполнения пользовательского действия с "Функция не выполнена во время выполнения. База данных: не удалось обновить таблицы. " - Это произошло из-за проблемы с индексацией, из-за которой код пытался записать строку в столбец int.
2) Если я поменяю строку
lRecord.SetString(2, lWebsiteName);
в
lRecord.SetString(2, lEntry.Name);
затем, глядя на трассировку, действие кажется успешным, но при запуске установщика у выпадающего списка нет записей для выбора.
Если я изменю в выпадающем списке жестко закодированные значения, все будет хорошо, даже если я жестко закодировал эквивалент lWebsiteName.