C#反射與特性應(yīng)用實例

應(yīng)用場景:1用SQL語句從數(shù)據(jù)庫返回一個DataTable對象,2然后綁定到DataGridView控件上,DataGridView列頭顯示的是數(shù)據(jù)庫里的英文字段名,3要顯示中文,需要建個對應(yīng)的EM實體模型府怯,并設(shè)置DisplayName特性;4DataGridView的某一行數(shù)據(jù)賦值給EM實體實例防楷;5EM實體實例綁定到PropertyGrid控件上牺丙;6在PropertyGrid上進行增刪改查的操作是很方便的。

1窗口布局

新建一個WinForm項目:ReflectionAndAttribute复局;擺放一個SplitContainer冲簿,Dock=Fill;左邊放一個DataGridView:dgv亿昏,Dock=Fill峦剔;右邊放一個PropertyGrid:pg,Dock = Fill龙优;創(chuàng)建好后布局大概如下圖:


反射與特性窗口布局

2綁定DataGridView:dgv

-窗口創(chuàng)建Load事件,代碼如下:

 private void Form1_Load(object sender, System.EventArgs e)
        {
            OracleDML.ConnectionString = "Data Source=CQYH;User Id=nmis;password=nmis";
            DataTable dt = OracleDML.AllTables();
            dgv.DataSource = dt;
        }

-其中OracleDML.AllTables()代碼如下:

/// <summary>
        /// 數(shù)據(jù)庫的全部表
        /// </summary>
        /// <returns></returns>
        public static DataTable AllTables()
        {
            string sql_tables = @"select TABLE_NAME,COMMENTS ,TABLE_TYPE
                            from user_tab_comments
                            where table_type = 'TABLE'
                            order by table_name";
            DataTable allTables = OracleDML.GetDataTable(sql_tables);
            allTables.TableName = "allTables";
            return allTables;
        }

-其中OracleDML.GetDataTable()代碼如下:

/// <summary>
        /// 查詢SQL_select,返回一個DataTable 彤断, 200207 add by Sufuq 
        /// </summary>
        /// <param name="cmdText"></param>
        /// <returns></returns>
        public static DataTable GetDataTable(string SQL_select)
        {
            //OracleCommand cmd = new OracleCommand();

            using (OracleConnection connection = new OracleConnection(ConnectionString))
            {
                OracleDataAdapter ada = new OracleDataAdapter(SQL_select, connection);
                //OracleCommandBuilder ocb = new OracleCommandBuilder(ada); //更新時需要這個
                DataTable dt = new DataTable();
                ada.Fill(dt);
                return dt;
            }
        }

-綁定后的運行效果

直接綁定后列名和SQL語句的名稱是一樣的英文

3創(chuàng)建EM實體類AllTables

創(chuàng)建換一個EM實體類野舶,并加上[DisplayName()]特性

using System.ComponentModel;

namespace ReflectionAndAttribute
{
    class AllTables
    {
        [DisplayName("表名")]
        public string TABLE_NAME { get; set; }
        [DisplayName("中文名")]
        public string COMMENTS { get; set; }
        [DisplayName("類型")]
        public string TABLE_TYPE { get; set; }
    }
}

4重點來了列頭變中文名

-Form1_Load添加如下一樣代碼:

//列頭設(shè)置為中文
            AttributeHelper.SetColumnDisplayName(typeof(AllTables), dgv);

-其中SetColumnDisplayName()用到反射和特性

/// <summary>
        /// 根據(jù)DataGridView綁定數(shù)據(jù)源的列名獲取EM實體模型的顯示名,用來設(shè)置列標(biāo)題宰衙。
        /// </summary>
        /// <param name="em"></param>
        /// <param name="dgv"></param>
        public static void SetColumnDisplayName(Type em , DataGridView dgv)
        {
            for (int i = 0; i < dgv.Columns.Count; i++)
            {
                string colName = dgv.Columns[i].Name;
                string DisName = GetDisplayName(em, colName);
                dgv.Columns[i].HeaderCell.Value = DisName;
            } 
        }

        /// <summary>
        /// 獲取類的DisplayName顯示名
        /// </summary>
        /// <param name="modelType">類名</param>
        /// <param name="propertyDisplayName">類屬性名</param>
        /// <returns></returns>
        public static string GetDisplayName(Type modelType, string propertyDisplayName)        
        {
            DisplayNameAttribute dna = TypeDescriptor.GetProperties(modelType)[propertyDisplayName].Attributes[typeof(DisplayNameAttribute)] as DisplayNameAttribute ;
            string displayName = "";
            if (dna == null)
            {
                displayName = propertyDisplayName;
            }
            else
            {
                displayName = dna.DisplayName;
            }
            return displayName;
            //return (TypeDescriptor.GetProperties(modelType)[propertyDisplayName].Attributes[typeof(DisplayNameAttribute)] as DisplayNameAttribute).DisplayName;        
        } 
看到?jīng)]真變中文名顯示了

5DataGridView某行數(shù)據(jù)實例化allTables并綁定PropertyGrid

-Form1上dgv添加RowEnter事件

private void dgv_RowEnter(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex >= 0 && e.ColumnIndex >= 0)
            {
                int row = e.RowIndex;
                //DataGridview行數(shù)據(jù)實例化AllTables
                AllTables em = AttributeHelper.DgvRowBindTOEM(dgv, row, typeof(AllTables)) as AllTables;
                //綁定到PropertyGrid
                pg.SelectedObject = em;
            }
        }

-其中DgvRowBindTOEM用到反射和特性

 /// <summary>
        /// DataGridView的某行綁定到實體模型EM 
        /// </summary>
        /// <param name="dgv"></param>
        /// <param name="row"></param>
        /// <param name="em"></param>
        /// <returns></returns>
        public static object DgvRowBindTOEM(DataGridView dgv ,int row,Type tEM)
        {
            //根據(jù)類型實例化一個對象
            object emReturn = System.Activator.CreateInstance(tEM);
            //dgv的一行數(shù)據(jù)復(fù)制給實體模型對象
            for (int i = 0; i < dgv.Columns.Count; i++)
            {
                string colName = dgv.Columns[i].Name.ToLower(); //數(shù)據(jù)庫名 = 列名.ToLower = 屬性名

                //string pName = StringHelper.FirstUpper(colName);//這里還可以加列名轉(zhuǎn)屬性名 
                
                PropertyInfo pInfo = tEM.GetProperty(colName); //根據(jù)列名取屬性信息
                object value = dgv.Rows[row].Cells[colName].Value; //列的數(shù)據(jù)值
                if (value == System.DBNull.Value) value = value.ToString(); //數(shù)據(jù)庫null轉(zhuǎn)換為string
                pInfo.SetValue(emReturn,value,null); //賦值給實例對象colName屬性
            }          
            return emReturn;
        }    

-最終完成效果

看到?jīng)]就是這么神奇

6對數(shù)據(jù)的增刪改查

6.1查詢平道, DataGridView的查詢過濾參閱http://www.reibang.com/p/b3d6ff3c93d6

6.2新增,只要把綁定在PropertyGrid的類清空即可

比如這樣:

AllTables em = new AllTables();
pG.SelectedObject = em;

6.3刪除,只要把PropertyGrid綁定的類傳給數(shù)據(jù)訪問層操作即可

 AllTables em = (AllTables )pG.SelectedObject;
OracleDML.Delete(em);

6.4修改供炼,只要把PropertyGrid綁定的類傳給數(shù)據(jù)訪問層操作即可

 AllTables em = (AllTables )pG.SelectedObject;
OracleDML.Update(em);

一屋。。袋哼。冀墨。。涛贯。诽嘉。。到此結(jié)束弟翘。虫腋。。稀余。悦冀。。睛琳。盒蟆。。掸掏。茁影。。

==========我是有底線的===============

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末丧凤,一起剝皮案震驚了整個濱河市募闲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌愿待,老刑警劉巖浩螺,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異仍侥,居然都是意外死亡要出,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門农渊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來患蹂,“玉大人,你說我怎么就攤上這事〈冢” “怎么了囱挑?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長沼溜。 經(jīng)常有香客問我平挑,道長,這世上最難降的妖魔是什么系草? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任通熄,我火速辦了婚禮,結(jié)果婚禮上找都,老公的妹妹穿的比我還像新娘唇辨。我一直安慰自己,他們只是感情好檐嚣,可當(dāng)我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布助泽。 她就那樣靜靜地躺著,像睡著了一般嚎京。 火紅的嫁衣襯著肌膚如雪嗡贺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天鞍帝,我揣著相機與錄音诫睬,去河邊找鬼。 笑死帕涌,一個胖子當(dāng)著我的面吹牛摄凡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蚓曼,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼亲澡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了纫版?” 一聲冷哼從身側(cè)響起床绪,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎其弊,沒想到半個月后癞己,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡梭伐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年痹雅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糊识。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡绩社,死狀恐怖摔蓝,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情愉耙,我是刑警寧澤项鬼,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站劲阎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鸠真。R本人自食惡果不足惜悯仙,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吠卷。 院中可真熱鬧锡垄,春花似錦、人聲如沸祭隔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疾渴。三九已至千贯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間搞坝,已是汗流浹背搔谴。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留桩撮,地道東北人敦第。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像店量,于是被迫代替她去往敵國和親芜果。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容

  • 小編費力收集:給你想要的面試集合 1.C++或Java中的異常處理機制的簡單原理和應(yīng)用融师。 當(dāng)JAVA程序違反了JA...
    八爺君閱讀 4,580評論 1 114
  • feisky云計算右钾、虛擬化與Linux技術(shù)筆記posts - 1014, comments - 298, trac...
    不排版閱讀 3,833評論 0 5
  • 蘋果官方文檔翻譯 《Objective-C語言編程》(Programming with Objective-C) ...
    fever105閱讀 25,631評論 19 130
  • 一個剛?cè)胄邪肽甑牟锁B安卓開發(fā)人員,始終有一顆不安分的心诬滩。mvvm框架是我在學(xué)習(xí)vue的時候才知道的一種新型架構(gòu)霹粥。公...
    sakasa閱讀 4,250評論 5 22
  • 第一章 對象導(dǎo)論 對象具有狀態(tài)、行為和標(biāo)識疼鸟。這意味著每一個對象都可以擁有內(nèi)部數(shù)據(jù)和方法后控,并且每一個對象都可以唯一地...
    niaoge2016閱讀 819評論 0 0