C# 設計時動態改變實體在PropertyGrid中顯示出來的屬性
方法一:
/// <summary>
/// 實體屬性處理
/// </summary>
public class PropertyHandle
{
#region 反射控制只讀、可見屬性
//SetPropertyVisibility(obj, "名稱 ", true);
//obj指的就是你的SelectObject, “名稱”是你SelectObject的一個屬性
//當然,呼叫這兩個方法後,重新SelectObject一下,就可以了。
/// <summary>
/// 通過反射控制屬性是否只讀
/// </summary>
/// <param name="obj"></param>
/// <param name="propertyName"></param>
/// <param name="readOnly"></param>
public static void SetPropertyReadOnly(object obj, string propertyName, bool readOnly)
{
Type type = typeof(ReadOnlyAttribute);
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(obj);
AttributeCollection attrs = props[propertyName].Attributes;
FieldInfo fld = type.GetField("isReadOnly", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.CreateInstance);
fld.SetValue(attrs[type], readOnly);
}
/// <summary>
/// 通過反射控制屬性是否可見
/// </summary>
/// <param name="obj"></param>
/// <param name="propertyName"></param>
/// <param name="visible"></param>
public static void SetPropertyVisibility(object obj, string propertyName, bool visible)
{
Type type = typeof(BrowsableAttribute);
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(obj);
AttributeCollection attrs = props[propertyName].Attributes;
FieldInfo fld = type.GetField("browsable", BindingFlags.Instance | BindingFlags.NonPublic);
fld.SetValue(attrs[type], visible);
}
#endregion
}
舉例:比如某個實體類TestEntity中有自增列(IdentityColumnInfo)這麼一個屬性,該自增列對應的實體類如下:public class IdentityColumnEntity
{
private bool isIncrementColumn;
/// <summary>
/// 是否是自增列
/// </summary>
[Browsable(true)]
[Category("基本")]
[DisplayName("是否是自增列")]
[ReadOnly(false)]
[DefaultValue(false)]
public bool IsIncrementColumn
{
set { isIncrementColumn = value; }
get { return isIncrementColumn; }
}
private Int64 identityIncrement;
/// <summary>
/// 標識增量
/// </summary>
[Browsable(true)]
[Category("基本")]
[DisplayName("標識增量")]
[ReadOnly(false)]
[Description("標識增量屬性指定在 Microsoft SQL Server 為插入的行生成標識值時,在現有的最大行標識值基礎上所加的值。標識增量必須是 非零 整數,位數等於或小於 10。")]
public Int64 IdentityIncrement
{
set { identityIncrement = value; }
get { return identityIncrement; }
}
private Int64 ident_Seed;
/// <summary>
/// 標識種子
/// </summary>
[Browsable(true)]
[Category("基本")]
[DisplayName("標識種子")]
[ReadOnly(false)]
[Description("指示標識列的初始行值。標識種子必須是 整數,位數等於或小於 10。")]
public Int64 Ident_Seed
{
set { ident_Seed = value; }
get { return ident_Seed; }
}
}
實體類TestEntity程式碼如下: public class TestEntity
{
private IdentityColumnEntity identityColumnInfo;
/// <summary>
/// 是否自增列
/// </summary>
[Category("擴充套件資訊")]
[DisplayName("自增列資訊")]
[ReadOnlyAttribute(true)]
[XmlIgnore]
[Browsable(true)]
//[XmlAttribute]
public IdentityColumnEntity IdentityColumnInfo
{
get
{
if (identityColumnInfo != null && identityColumnInfo.IsIncrementColumn)
{
PropertyHandle.SetPropertyReadOnly(identityColumnInfo, "Ident_Seed", true);
PropertyHandle.SetPropertyReadOnly(identityColumnInfo, "IdentityIncrement", true);
PropertyHandle.SetPropertyReadOnly(identityColumnInfo, "IsIncrementColumn", true);
PropertyHandle.SetPropertyReadOnly(this, "IsInsert", true);
PropertyHandle.SetPropertyReadOnly(this, "IsUpdate", true);
}
return identityColumnInfo;
}
set
{
identityColumnInfo = value;
}
}
/// <summary>
/// 是否插入
/// </summary>
[Category("維護資訊")]
[DisplayName("是否插入")]
[ReadOnlyAttribute(false)]
[XmlAttribute]
public bool IsInsert
{
get
;
set
;
}
/// <summary>
/// 是否更新
/// </summary>
[Category("維護資訊")]
[DisplayName("是否更新")]
[ReadOnlyAttribute(false)]
[XmlAttribute]
public bool IsUpdate
{
get
;
set
;
}
}
通過 PropertyHandle.SetPropertyReadOnly即可實現,效果如下:演示原始碼:點選開啟連結
本文參考: 如何在設計時中動態改變控制元件屬性在PropertyGrid中顯示出來的只讀性
小注:
方法二:即參考文章中提到的:Unleash PropertyGrid with Dynamic Properties and Globalization
原始碼及演示demo下載:點選開啟連結
相關文章
- C# 自定義屬性在propertyGrid控制元件中顯示C#控制元件
- C#中改變顯示器的解析度 (轉)C#
- 動態改變actionbar的menu選單MenuItem的顯示UI
- 在使用tiles時,如何在ie中顯示動態的標題
- 【Vue】探索物件屬性變動在Vue中的具體表現Vue物件
- javascript動態改變iframe元素src屬性程式碼例項JavaScript
- WPF當屬性值改變時利用PropertyChanged事件來載入動畫事件動畫
- WinPE中如何改變檔案顯示圖示
- C# 設計一個類,監視這個類的屬性有沒發生改變C#
- Java物件轉JSON時如何動態的增刪改查屬性Java物件JSON
- [全程建模]屬性方法是否都要在UML中設計出來?
- 控制檯中動態顯示系統時間
- Laravel 動態屬性的實現Laravel
- QT實現動態顯示系統時間QT
- 在 Laravel 中動態 隱藏 / 顯示 API 欄位LaravelAPI
- 不使用反射進行C#屬性的執行時動態訪問反射C#
- python實現在類中動態新增屬性和生成物件Python物件
- css設定屬性文字超出隱藏顯示…,但有的時候三個點顯示不全CSS
- JavaScript監聽屬性改變JavaScript
- jquery改變元素屬性值jQuery
- 改變檔案屬性 (轉)
- C# 4.0中的動態型別和動態程式設計C#型別程式設計
- 用VB設計能適應各種顯示屬性的介面 (轉)
- 用CSS來改變網頁滑鼠顯示樣式的方法CSS網頁
- 實時渲染對3D設計行業帶來哪些改變?3D行業
- XE 畫矩形實現拖拉改變大小(屬性)
- CSScursor屬性改變滑鼠的樣式CSS
- SQL Server 生成C#公共實體屬性和私有屬性SQLServerC#
- 使用RecyclerView動態改變item時遇到的坑View
- javaScript動態顯示當前時間JavaScript
- C#中屬性的解析C#
- jquery實現的點選按鈕改變可用狀態和顯示文字程式碼jQuery
- Linux下設定終端文字的顯示屬性Linux
- 動態改變螢幕設定 (轉)
- jQuery 點選按鈕改變可用狀態和顯示文字jQuery
- js 改變 控制元件的屬性值JS控制元件
- 在Android中呼叫攝像頭拍照並顯示出來Android
- vue中:is的用法,動態顯示需要的元件Vue元件