Listbox Wix填充列表框
我试图在列表框中填入CustomAction,但进展不顺利。 我试图找出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
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表。我说的是表格数据。