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下載:點選開啟連結
相關文章
- WPF當屬性值改變時利用PropertyChanged事件來載入動畫事件動畫
- 【Vue】探索物件屬性變動在Vue中的具體表現Vue物件
- Java物件轉JSON時如何動態的增刪改查屬性Java物件JSON
- 在WPF程式中實現PropertyGrid功能
- Laravel 動態屬性的實現Laravel
- JavaScript監聽屬性改變JavaScript
- Linux下設定終端文字的顯示屬性Linux
- SQL Server 生成C#公共實體屬性和私有屬性SQLServerC#
- css設定屬性文字超出隱藏顯示…,但有的時候三個點顯示不全CSS
- XE 畫矩形實現拖拉改變大小(屬性)
- 實時渲染對3D設計行業帶來哪些改變?3D行業
- 在 Laravel 中動態 隱藏 / 顯示 API 欄位LaravelAPI
- C#中屬性的解析C#
- 使用RecyclerView動態改變item時遇到的坑View
- js 改變 控制元件的屬性值JS控制元件
- C#給自動屬性設定預設值C#
- 在Android中呼叫攝像頭拍照並顯示出來Android
- 遮蔽在建構函式中初始化qtablewidget時觸發單元改變的槽函式(介面還沒有顯示出來)函式QT
- javaScript動態顯示當前時間JavaScript
- Winform窗體的屬性頁沒有顯示篩選框ORM
- 在一個元素上:hover,改變另一個元素的css屬性CSS
- WPF/C#:在DataGrid中顯示選擇框C#
- 詳情屬性圖示設計參考
- VueJs中動態更改svg的相關屬性VueJSSVG
- vue中:is的用法,動態顯示需要的元件Vue元件
- Swagger中配置了@ApiModelProperty的allowableValues屬性但不顯示的問題SwaggerAPI
- react native拖動上方顯示值,改變背景顏色的sliderReact NativeIDE
- Qt設計:時間顯示(QTimer)QT
- IOS 動態改變cell的高度iOS
- 在使用python matplotlib和Axes3D繪製曲面時,改變facecolors的顯示範圍使其表示真實值。PythonS33D
- 從屬性剋制延伸而來的多屬性隊伍養成設計
- 在 appium 的元素查詢時,一個 ListView 下的一個顯示框,取 text 屬性的問題APPView
- qt中實現實時的顯示當前時刻的時間QT
- C#反射設定屬性值和獲取屬性值C#反射
- java判斷實體內中屬性值內容是否有變更(包含父類屬性值)Java
- Python - 物件導向程式設計 - 類變數、例項變數/類屬性、例項屬性Python物件程式設計變數
- 帝國cms標題設定了加粗、顏色等屬性在內容頁顯示
- 動態的新增ImageView到LinearLayout中並居中顯示View
- Vue 動態繫結圖片 src 屬性閃屏 白屏 無內容顯示 BUG 小記Vue