2012-02-29 11 views
0

VS2010のSQL接続ダイアログを正常に実装しました(hereからいくつかのプロジェクトにダウンロードして、不平を言わずに使用しています)。私は、ユーザーが「自分のパスワードを保存]チェックボックスをチェックしたかどうかをテストしたかった、以下に示す:VS2010のSQL接続ダイアログ

VS2010 Connection Dialog

public partial class SqlConnectionUIControl : UserControl, IDataConnectionUIControlは、情報へのアクセサのすべてが含まれているControlPropertiesと呼ばれるプライベートメンバクラスを持っているI必要性 - しかし、私はそれに到達することはできません。

このダイアログの記述方法はかなり複雑で、私が助けてもらえればソースコードを変更するつもりはありません。誰かがこれを前に見つけたことがありますか?そうであれば、ユーザーが「public bool SavePasswordを介してSqlConnectionUIControlクラスにアクセスする」オプションを選択したかどうかを確認するにはどうすればよいですか?

+0

反射を使用してこのプロパティを取得できます。少し不安ですが、そのトリックを行います:)もしあなたが望めば、私はそのためのコードスニペットを投稿することができます。 –

+0

私はその男が大好きです。ありがとうございました。 – MoonKnight

答えて

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ダイアログライブラリをアップグレードするつもりなら将来、これらのプロパティは新しいバージョンでは利用できない可能性があります。

+0

ありがとうございます。あなたはこのダイアログを使ってあなた自身をやったことがありますか? – MoonKnight

+0

@Killercam:いいえ、私は今すぐ書いた。しばらく前にこのダイアログを使用したことを覚えていますが、その作業は「パスワードを保存する」チェックボックスをチェックする必要はありませんでした。 –

+0

これは驚くべきことですが、このようなことにリフレクションを使用できるかどうかはわかりませんでした。私はあなたがこれをすばやく行うことができたことをあなたがどのように知っているかを知ることに驚くでしょう! – MoonKnight