Wix填充列表框

时间:2013-02-01 15:41:11

标签: listbox wix

我正在尝试使用CustomAction填充ListBox,但它并不顺利。 我试图找出session.Database.Tables,但不知道如何开始。

我已经创建了一个像这样的列表框

<Control Id="ListBox1" Type="ListBox" Sorted="no"  Indirect="no" Property="LISTBOXVALUESONE" X="10" Y="50" Width="150" Height="180">
      <ListBox Property="LISTBOXVALUESONE">
        <ListItem Text="ARGHH!" Value="1"/>
      </ListBox>
    </Control>

但我无法在verbrose日志中看到该属性或者有关表的任何内容,所以我想我必须在customAction中创建一个表并填充它? 我在列表中看到了ARGHH!,所以它应该存在,但我如何访问这些值?并添加新的?

在C ++中找到更多示例和内容,但我想在C#中创建CustomAction

修改

Database db = session.Database;
string sqlInsertTemp = db.Tables["ListBox"].SqlInsertString + " TEMPORARY";
View view = db.OpenView(sqlInsertTemp );
view.Execute( new Record( new object[] { "LISTBOXVALUESONE", 2, "2", "One" } ));
view.Close();

感谢克里斯托弗,我得到它来增加价值。

db.Tables["ListBox"]应该保持不变,并按照我的教导命名类型而不是id 在这一行view.Execute( new Record( new object[] { "LISTBOXVALUESONE", 2, "2", "One" } )); 你把你的Listbox属性放在我们插入的值“one”的位置

两个“2”是我想要的位置,我已经在1上有一个测试值 我的“ARGHH!”所以我把新的东西放在2上并且不知道细节但是......

我得到了一个表更新错误,如果我在习惯中放入2,1或1,2,则会出现一个dublicate值错误!

2 个答案:

答案 0 :(得分:3)

我写了一篇大约5年前的博客文章可能会对你有所帮助:

How DTF is going to help me become a better .NET Developer

您希望确保构建的MSI具有ListBox表,否则当SQL尝试在运行时动态生成临时行时,SQL将无法运行。如果ListBox元素不为您执行此操作,那么EnsureTable元素将为。

实际的C#看起来像:

Database db = session.Database;
string sqlInsertTemp = db.Tables["ListBox"].SqlInsertString + " TEMPORARY";
View view = db.OpenView(sqlInsertTemp );
view.Execute( new Record( new object[] { "TESTPROP", 1, "1", "One" } ));
view.Close();

请注意,这是一个旧代码示例,并未正确利用using语句和IDisposable。

答案 1 :(得分:0)

将一条记录添加到列表框中:

private void AddRecordToListBox(string listBoxPropertyName, int index, string text, string value)
{
    View view = session.Database.OpenView("SELECT * FROM ListBox");
    view.Execute();

    Record record = session.Database.CreateRecord(4);

    record.SetString(1, listBoxPropertyName);
    record.SetInteger(2, index);
    record.SetString(3, value);
    record.SetString(4, text);

    view.Modify(ViewModifyMode.InsertTemporary, record);
    view.Close();
}

填写ListBox:

private void FillListBox()
{
    var dict = SomeDict();

    int index = 1;
    foreach (var element in dict)
    {
        AddRecordToListBox(ListBoxName, index, element.Key, element.Value);
        index++;
    }
}

清除列表框

private void ClearListBox(string listBoxPropertyName)
{
    var command = String.Format("DELETE FROM ListBox WHERE ListBox.Property='{0}'", listBoxPropertyName);
    View view = session.Database.OpenView(command);
    view.Execute();
    view.Close();
}