VS2010 SQL连接对话框

时间:2012-02-29 17:41:41

标签: c# sql visual-studio-2010 sqlconnection

我已经成功实现了VS2010 SQL连接对话框(现在从here下载到我的一些项目中并且一直在使用它。我一直在明确地使用它连接到SQL Server,最近我我想测试用户是否选中了“保存我的密码”复选框,如下所示:

VS2010 Connection Dialog

public partial class SqlConnectionUIControl : UserControl, IDataConnectionUIControl有一个名为ControlProperties的私有成员类,其中包含我需要的所有信息的访问者 - 但我无法达到它。

编写此对话框的方式相当复杂,如果我能帮助它,我不想更改源代码。之前是否有人遇到此问题,如果有,我如何阅读用户是否选择了“保存我的密码”(通过SqlConnectionUIControl课程通过public bool SavePassword)选项(或任何其他此类选项) )?

1 个答案:

答案 0 :(得分:2)

如果在这种情况下可以使用Reflection,则可以深入了解私有属性并提取其值。以下是一个示例(基于您链接中的Microsoft.Data.ConnectionUI.Sample项目):

static void Main(string[] args)
{
    DataConnectionDialog dialog = new DataConnectionDialog();
    DataConnectionConfiguration connectionConfig = new DataConnectionConfiguration(null);
    connectionConfig.LoadConfiguration(dialog);

    if (DataConnectionDialog.Show(dialog) == DialogResult.OK)
    {
        bool isSavePasswordChecked = IsSavePasswordChecked(dialog);
    }
}

private static bool IsSavePasswordChecked(DataConnectionDialog dialog)
{
    var control = GetPropertyValue("ConnectionUIControl", dialog, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetProperty);
    if (control == null)
    {
        return false;
    }

    var properties = GetPropertyValue("Properties", control, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetProperty | BindingFlags.DeclaredOnly);
    if (properties == null)
    {
        return false;
    }

    var savePassword = GetPropertyValue("SavePassword", properties, BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty);
    if (savePassword != null && savePassword is bool)
    {
        return (bool)savePassword;
    }

    return false;
}

private static object GetPropertyValue(string propertyName, object target, BindingFlags bindingFlags)
{
    var propertyInfo = target.GetType().GetProperty(propertyName, bindingFlags);
    if (propertyInfo == null)
    {
        return null;
    }

    return propertyInfo.GetValue(target, null);
}

但请记住,此方法会引入一些版本问题:如果您将来某个时候要升级DataConnection对话库,则这些属性可能在较新版本中不可用。