如何从自定义动作填充WIX组合框
问题描述:
我已经添加了组合框到我的用户界面。如何从自定义动作填充WIX组合框
<Control Id ="ExistingPortCombo" Type="ComboBox" X="120" Y="120" Width="200" Height="50" Property="ComboSelectedPort" ComboList="yes" >
<ComboBox Property="ComboSelectedPort" />
</Control>
我希望它从自定义操作中填充。我尽可能做到这一点。
这里是我的功能来填充列表
static int index = 0;
private static void AddRecordToList(string propertyName,string text,string value,string control)
{
try
{
View view = CurrentSession.Database.OpenView("SELECT * FROM " + control);
view.Execute();
Record record = CurrentSession.Database.CreateRecord(4);
record.SetString(1, propertyName);
record.SetInteger(2, ++index);
record.SetString(3, text);
record.SetString(4, value);
view.Modify(ViewModifyMode.InsertTemporary, record);
view.Close();
}
catch (Exception ex)
{
global::System.Windows.Forms.MessageBox.Show(ex.Message);
}
}
然后我打电话:
AddRecordToComboBox("ComboSelectedPort", text, value,"ComboBox");
此方法适用于列表框,但但对于组合框给出错误。
任何人都可以看到我在这里做错了吗?
答
基于this后,我可以填充组合框
中的.msi我不得不创建组合框的表将一个项目添加到一个值。
<ListItem Value="1" Text="DumyData" />
我在这里添加的项目没有在我的ComboBox上列出,所以现在这是可以的。如果有人知道如何以适当的方式做到这一点,欢迎回答。
我的控制器现在看起来像这样。
<Control Id ="ExistingPortCombo" Type="ComboBox" X="120" Y="120" Width="200" Height="50" Property="ComboSelectedPort" ComboList="yes" >
<ComboBox Property="ComboSelectedPort" >
<ListItem Value="1" Text="DumyData" />
</ComboBox>
答
我已经使用了几乎相同的方法。
你可以试着读端口列表的这个例子从文件:
[CustomAction]
public static ActionResult GetPortsFromFile(Session session)
{
const string tableName = "ComboBox";
const string Property = "ComboSelectedPort";
const string PortsConfigFile = "Ports.txt";
string strPorts = File.ReadAllText(PortsConfigFile);
string[] PortsList = strPorts.Split(',');
int order = 2;
foreach (var Port in PortsList)
{
string value = Port.ToString();
string text = Port.ToString();
object[] fields = new object[] { Property, order, value, text };
InsertRecord(session, tableName, fields);
order++;
}
return ActionResult.Success;
}
private static void InsertRecord(Session session, string tableName, Object[] objects)
{
Database db = session.Database;
string sqlInsertSring = db.Tables[tableName].SqlInsertString + " TEMPORARY";
session.Log("SqlInsertString is {0}", sqlInsertSring);
View view = db.OpenView(sqlInsertSring);
view.Execute(new Record(objects));
view.Close();
}