如何从自定义操作填充 WIX 组合框
How to populate WIX combo box from Custom action
我在 UI 中添加了一个组合框。
<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");
此方法适用于列表框,但对于组合框会出错。
谁能看出我做错了什么?
我用过几乎一样的方法
您可以试试这个从文件中读取端口列表的例子:
[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();
}
基于thispost,我可以填充组合框
要在 .msi 中创建组合框 table 我必须向值添加一个项目。
<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>
我在 UI 中添加了一个组合框。
<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");
此方法适用于列表框,但对于组合框会出错。
谁能看出我做错了什么?
我用过几乎一样的方法
您可以试试这个从文件中读取端口列表的例子:
[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();
}
基于thispost,我可以填充组合框
要在 .msi 中创建组合框 table 我必须向值添加一个项目。
<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>