Listbox Wix填充列表框

Listbox Wix填充列表框,listbox,wix,Listbox,Wix,我试图在列表框中填入CustomAction,但进展不顺利。 我试图找出session.Database.Tables,但不知道如何开始 我创建了一个这样的列表框 <Control Id="ListBox1" Type="ListBox" Sorted="no" Indirect="no" Property="LISTBOXVALUESONE" X="10" Y="50" Width="150" Height="180"> <ListBox Property="L

我试图在列表框中填入CustomAction,但进展不顺利。 我试图找出
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>
多亏了克里斯托弗,我才使它增值

db.Tables[“ListBox”]
应保持不变,并将类型命名为我教过的id 并在这一行
view.Execute(新记录(新对象[]{“LISTBOXVALUESONE”,2,“2”,“1”)
您可以放置Listbox属性,然后放置我们插入的值“one”

这两个“2”是我们想要的位置,我已经在1上有了一个测试值 我的“啊!”所以我把新的放在2上,不知道细节,但是


我得到了一个表更新错误,如果我在customaction中放入2,1或1,2,则出现了一个简单的值错误

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

您希望确保构建的MSI具有ListBox表,否则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();

注意:这是一个旧的代码示例,没有正确地利用语句和IDisposable。

大约5年前我写了一篇博客文章,可能会帮助您:

您希望确保构建的MSI具有ListBox表,否则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();

注意:这是一个旧的代码示例,没有正确利用语句和IDisposable。

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

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();
}
填写列表框:

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();
}

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

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();
}
填写列表框:

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();
}

谢谢你克里斯托弗:)如果有人想知道“TESTPROP”,1,“1”,“1”行,我测试了我的编辑中的一些变体,那么它可以增加一个值!我想你会明白这些值只是样本数据,并不适合你的情况。这是5年前写的。如果查看MSDN(),您将看到主键位于前两列。每一行/每一个订单都必须是独一无二的。是的,谢谢你:)我现在明白多了。这个链接也很有帮助()谢谢Christopher:)如果有人想知道“TESTPROP”,1,“1”,“1”行,我测试了一些变体,看看我的编辑!我想你会明白这些值只是样本数据,并不适合你的情况。这是5年前写的。如果查看MSDN(),您将看到主键位于前两列。每一行/每一个订单都必须是独一无二的。是的,谢谢你:)我现在明白多了。这个链接也很有帮助()在MSI中动态发出行是一个强大的概念,但是警告您在构建时失去了验证的好处。因此,您必须确保插入的行是100%有效的。@ChristopherPaint是XML的有效字符吗?幸运的是我读了foldernames,它们不能用任何你想要的东西命名:)XML用于创建Windows Installer表。我说的是表格数据。在MSI中动态发出行是一个强大的概念,但请注意,您将失去在构建时进行验证的好处。因此,您必须确保插入的行是100%有效的。@ChristopherPaint是XML的有效字符吗?幸运的是我读了foldernames,它们不能用任何你想要的东西命名:)XML用于创建Windows Installer表。我说的是表格数据。