C# VS2010 SQL连接对话框
我已经成功地实现了VS2010 SQL连接对话框(从下载到我的一些项目中),并且一直在毫无怨言地使用它。我一直在显式使用它来连接SQL Server,最近我想测试用户是否选中了“保存我的密码”复选框,如下所示:C# VS2010 SQL连接对话框,c#,sql,visual-studio-2010,sqlconnection,C#,Sql,Visual Studio 2010,Sqlconnection,我已经成功地实现了VS2010 SQL连接对话框(从下载到我的一些项目中),并且一直在毫无怨言地使用它。我一直在显式使用它来连接SQL Server,最近我想测试用户是否选中了“保存我的密码”复选框,如下所示: 公共部分类sqlconnectionicontrol:UserControl,IDataConnectionUIControl有一个名为ControlProperties的私有成员类,其中包含我需要的信息的所有访问器-但我无法访问它 这个对话框的编写方式相当复杂,如果我能帮助的话,我不
公共部分类sqlconnectionicontrol:UserControl,IDataConnectionUIControl
有一个名为ControlProperties
的私有成员类,其中包含我需要的信息的所有访问器-但我无法访问它
这个对话框的编写方式相当复杂,如果我能帮助的话,我不想去更改那里的源代码。以前有人遇到过这个问题吗?如果是,我如何读取用户是否选择了“保存我的密码”(通过
public bool SavePassword
在sqlconnectionicontrol
类中访问)选项(或任何其他相关内容)如果您可以在这种情况下使用反射,您可以深入挖掘私有属性并提取它们的值。下面是一个示例(基于链接中的Microsoft.Data.ConnectionUI.Sample项目):
但请记住,这种方法会带来一些版本控制问题:如果您打算在将来某个时候升级DataConnection对话框库,这些属性可能在较新的版本中不可用。好的,您可以使用反射来检索此属性。有点不可靠,但可以做到:)如果你愿意,我可以发布一个代码片段。我会喜欢那个家伙。非常感谢……谢谢你。这是你自己用这个对话框做的吗?@Killercam:不,我刚才写的。我记得不久前使用过这个对话框,但这个任务不涉及检查“保存密码”复选框。这太神奇了,我不知道你可以用反射来做这类事情。如果你知道你能这么快做到这一点,我会感到惊讶!?@Killercam:谢谢:)我知道这种方法,因为我过去曾多次使用它来调查一些外部库的行为。
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);
}