2012-02-29 71 views
0

我已经成功地实施了VS2010 SQL连接对话框(从here下载到我的几个项目,现在一直在使用它毫无怨言被。我一直在使用它明确地连接到SQL Server,以及最近我一直想测试用户是否已经检查了“保存密码”复选框,如下图所示:VS2010的SQL连接对话框

VS2010 Connection Dialog

public partial class SqlConnectionUIControl : UserControl, IDataConnectionUIControl有一个名为ControlProperties包含所有的访问器的信息的私有成员I类所需要的 - 但我不能得到它

是这样写对话的方式是相当复杂的,我不想去改变那里的源代码,如果我能帮助它。有没有人遇到此之前,如果是这样,我怎么看用户是否选择了“保存密码”选项(或任何其他为此事)(通过public bool SavePasswordSqlConnectionUIControl类访问)?

+0

嗯,你可以使用反射来检索该属性。有点不可靠,但会做的伎俩:)如果你愿意,我可以发布一个代码片段。 – 2012-02-29 17:59:27

+0

我很喜欢那个家伙。非常感谢... – MoonKnight 2012-02-29 18:08:27

回答

2

如果它的确定,为您在这种情况下使用反射,你可以挖掘到私有财产,并提取它们的值。下面是一个例子(基于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对话框库在某些时候升级未来,这些属性可能无法在新版本中使用。

+0

感谢您的支持。这是你用这个对话完成的事情吗? – MoonKnight 2012-02-29 19:06:31

+0

@Killercam:不,我刚才写道。我记得前一段时间使用此对话框,但该任务不涉及检查“保存密码”复选框。 – 2012-02-29 19:11:00

+0

这是惊人的,我不知道你可以使用反射这种事情。如果你知道你可以这么快做到这一点,我会很惊讶! – MoonKnight 2012-02-29 19:21:39