0

在我的安装程序中,我希望用户连接到数据库。我的产品支持 4 种数据库类型。在我创建的连接到数据库对话框中,有一个包含所有支持的数据库类型的 ComboBox 控件,用户假设在其中输入连接字符串和一个 PushButton 的编辑控件,按下时它将根据所选数据库在编辑控件中显示连接字符串文本模板输入组合框。现在,问题是:

  1. 选择 MSSQL 时,用户单击“显示模板”按钮
  2. 用户在编辑控件中手动更改文本模板连接字符串中的占位符
  3. 用户意识到他需要 MySQL 连接
  4. 用户将 ComboBox 中的值更改为 MySQL,然后单击 Show Template 按钮,没有任何反应。

总而言之,在手动更改编辑控件后,显示模板停止工作。

这是 WiX 代码的使用:

<Fragment>
    <!-- Supported databases templates -->
    <Property Id="MSSQLTemplate" Value="Data Source=localhost;Initial Catalog=[database];Integrated Security=yes"/>
    <Property Id="MySQLTemplate" Value="Server=localhost;Uid=[username];Pwd=[password];Database=[database];" />
    <Property Id="DB2Template" Value="Server=localhost;Uid=[username];Pwd=[password];Database=[database];" />
    <Property Id="OracleTemplate" Value="Data Source=[database];User Id=[username];Password=[password];" />

    <Property Id="PROP_DATABASE_TYPE">MSSQL</Property>
    <Property Id="PROP_CONNECTIONSTRING"></Property>

    <Binary Id="CA_DLL" SourceFile="$(var.CustomActions.TargetDir)CustomActions.CA.dll" />
    <CustomAction Id="caShowTemplate" BinaryKey="CA_DLL" DllEntry="ShowTemplate" Execute="immediate" />
    <UI Id="InstallDlg_UI">
      <TextStyle Id="Tahoma_Regular" FaceName="Tahoma" Size="8" />
      <Property Id="DefaultUIFont" Value="Tahoma_Regular" />
      <Dialog Id="InstallDlg" Width="370" Height="270" Title="Amazing Software" NoMinimize="no">
        <!-- Database type -->
        <Control Id="lblDatabaseType" Type="Text" X="20" Width="100" Y="60" Height="18" NoPrefix="yes" Text="Database Type" />
        <Control Id="cbDatabaseServer" Type="ComboBox" X="120" Width="90" Y="60" Height="18" Property="PROP_DATABASE_TYPE" ComboList="yes" Sorted="yes">
          <ComboBox Property="PROP_DATABASE_TYPE">
            <ListItem Text="MSSQL" Value="MSSQL" />
            <ListItem Text="MySQL" Value="MySQL" />
            <ListItem Text="Oracle" Value="Oracle" />
            <ListItem Text="DB2" Value="DB2" />
          </ComboBox>
        </Control>
        <Control Id="btnShowTemplate" Type="PushButton" X="215" Y="60" Width="85" Height="17" Text="Show Template">
          <Publish Event="DoAction" Value="caShowTemplate" Order="1">1</Publish>
          <Publish Property="PROP_CONNECTIONSTRING" Value="[PROP_CONNECTIONSTRING]" Order="2">1</Publish>
        </Control>
        <!-- Connection string -->
        <Control Id="lblConnectionString" Type="Text" X="20" Width="100" Y="85" Height="18" NoPrefix="yes" Text="Connection String" />
        <Control Id="tbConnectionString" Type="Edit" X="120" Width="180" Y="85" Height="18" Property="PROP_CONNECTIONSTRING" Text="[PROP_CONNECTIONSTRING]" />
        <Control Id="CancelButton" Type="PushButton" Text="Cancel" Height="17" Width="56" X="180" Y="243" Cancel="yes">
          <Publish Event="EndDialog" Value="Exit" />
        </Control>
      </Dialog>
      <InstallUISequence>
        <Show Dialog="InstallDlg" Before="ExecuteAction" />
      </InstallUISequence>
    </UI>
  </Fragment>

还有一个用 C# 编写的自定义操作:

[CustomAction]
public static ActionResult ShowTemplate(Session session)
{
  string selectedDatabase = string.Format("{0}Template", session["PROP_DATABASE_TYPE"]);
  session["PROP_CONNECTIONSTRING"] = session[selectedDatabase];
  return ActionResult.Success;
}

我究竟做错了什么?

4

1 回答 1

1

您的代码没有任何问题。这是 WIX UI 的一个众所周知的限制。查看以下讨论以获取更多详细信息。

http://windows-installer-xml-wix-toolset.687559.n2.nabble.com/UI-Edit-Box-not-updating-td5077648.html

Wix 与条件、属性和自定义操作的交互

于 2013-07-22T14:02:19.247 回答