【问题标题】:Wix populate listboxWix 填充列表框
【发布时间】:2013-02-01 15:41:11
【问题描述】:

我正在尝试使用 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>

但是我在详细日志中看不到该属性或任何关于表格的内容,所以我想我必须在 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();

多亏了 Christopher,我才得以使用它来增加价值。

db.Tables["ListBox"] 应该保持不变并命名类型而不是我教的 id 在这条线上view.Execute( new Record( new object[] { "LISTBOXVALUESONE", 2, "2", "One" } )); 你把你的列表框属性,然后我们插入的值“一”的位置

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

我收到一个表更新错误,如果我在 customaction 中输入 2,1 或 1,2,则会出现一个重复值错误!

【问题讨论】:

标签: listbox wix


【解决方案1】:

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

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

您要确保您构建的 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();

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

【讨论】:

  • 谢谢克里斯托弗 :) 如果其他人对“TESTPROP”、1、“1”、“One” 行感到好奇,我在编辑中测试了一些变体,它可以添加一个值!
  • 我假设您会理解这些值只是示例数据,并不适合您的情况。这是5年前写的。如果您查看 MSDN (msdn.microsoft.com/en-us/library/windows/desktop/…),您会发现主键位于前两列。每个行/顺序必须是唯一的。
  • 是的,谢谢 :) 我现在明白了很多。这个链接也很有帮助 (blog.torresdal.net/2008/10/24/…)
【解决方案2】:

向列表框添加一条记录:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多