Диалог подключения SQL VS2010 - PullRequest
0 голосов
/ 29 февраля 2012

Я успешно внедрил диалоговое окно подключения SQL VS2010 (загруженное с здесь в несколько моих проектов сейчас и использую его без жалоб. Я использовал его явно для подключения к SQL Server, и недавно я хотел проверить, установил ли пользователь флажок «Сохранить мой пароль», показанный ниже:

VS2010 Connection Dialog

public partial class SqlConnectionUIControl : UserControl, IDataConnectionUIControl имеет закрытый класс-член ControlProperties, который содержит все средства доступа к информации, которая мне нужна, но я не могу получить к ней доступ.

Способ написания этого диалога довольно сложен, и я не хочу менять там исходный код, если смогу помочь. Кто-нибудь сталкивался с этим раньше и если да, то как мне узнать, выбрал ли пользователь опцию «Сохранить мой пароль» (доступ к которой осуществляется в классе SqlConnectionUIControl через public bool SavePassword) (или любой другой в этом отношении)?

1 Ответ

2 голосов
/ 29 февраля 2012

Если в этом случае вы можете использовать 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 в будущем, эти свойства могут быть недоступны в более новых версиях.

...