我正在尝试使用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值错误!
答案 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();
}