0

我正在尝试用 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();

多亏了克里斯托弗,我让它能够增加价值。

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

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

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

4

2 回答 2

3

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

DTF 将如何帮助我成为更好的 .NET 开发人员

你要确保你构建的 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。

于 2013-02-02T03:13:18.033 回答
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();
}

填充列表框:

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();
}
于 2015-10-09T10:10:38.217 回答