2012-02-29 38 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