如何从自定义操作填充 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>