[C#.NET][User Control] 使用 IExtenderProvider 擴充控制項屬性 並 驗証控制項角色 (再續)
續上篇,同樣的設計不知道會續到什麼時候(聳肩,我也不知道),可能直到我自己滿意為止吧,這篇解決了上篇的一些問題,主要是集合屬性無法讓VS自動反序列化,後來研究將集合屬性,改為繼承集合類別,這樣便可以讓VS正常的反序列化,就像Pemissions 類別一樣
public class Pemissions : List<Pemission>
{
}
[Serializable, TypeConverter(typeof(ExpandableObjectConverter))]
public class Role
{
[DefaultValue(false)]
public bool IsIdentity { get; set; }
internal Pemissions _Pemissions;
public ReadOnlyCollection<Pemission> Pemissions
{
get
{
return new ReadOnlyCollection<Pemission>(_Pemissions);
}
}
public override string ToString()
{
return string.Format("Is Apply Identity={0}", IsIdentity);
}
}
解決了集合的問題,也更改使用者體驗,有設定控制項的IsIdentity=true的控制項,程式才會驗証是否通過身份驗証,反之則不驗証。
另外,在Role屬性裡,預設加入3種權限
{
if (this._Roles.ContainsKey(Ctrl))
{
return this._Roles[Ctrl];
}
else
{
Role role = new Role()
{
IsIdentity = false,
_Pemissions = new Pemissions
{
new Pemission() { Role = RoleType.Admin, IsEdit = true, IsView = true },
new Pemission() { Role = RoleType.PowerUser, IsEdit = false, IsView = true },
new Pemission() { Role = RoleType.User, IsEdit = false, IsView = false }
}
};
this._Roles.Add(Ctrl, role);
return role;
}
}
並且不讓使用者任意增加成員,避免不必要的錯誤。
在下圖我們看到左邊的Add/Remove按鈕被反白了,那是因為ReadOnlyCollection類別的關係;右邊的Role屬性被反白了,那也是我們不公開變更屬性的關係。
就設定上而言,這樣的做法的確比上篇好很多,如果你有用過上篇的範例,你會發現在這裡少按了很多按鈕。接下來,看看VS幫我們做了什麼。
VS會自動產生程式碼在Form1.Desinger.cs檔裡
而resources.GetObject("label1.Role")這些資訊放在Form1resx裡
而Form.resx內部長這樣,應該是存成了二進位
一載入沒有任何角色登入
Admin登入
Power登入
User登入
同樣的,為了這效果又用掉了我一天的時間Orz!!
範例下載:
System.Windows.Forms.Extend.Security.zip
若有謬誤,煩請告知,新手發帖請多包涵

Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET
