使用WPF實現頁面資料到資料庫再繫結DataGird控制元件相關技術總結
前言:
最近公司讓做一個關於WPF開發的一個標籤程式,想同步做一個總結,來給自己鞏固一下,同時也感慨部落格網給予的巨大幫助,寫篇文章也能幫助需要的人。
業務能力是關鍵的,剛開始不懂業務,領導交給一個標籤程式,相關資料也沒給全,只說了要做什麼,開發很多後需求又變了,搞了很多麻煩事,這個確實應該資訊採集準確無誤,再開始寫程式碼。在剛開始時就需要把資料補齊,補齊再動手編碼。
正文:
在寫程式碼之前,需要審視一下自己程式碼的邏輯理清楚了沒,先不急寫程式碼,最好能在紙上畫個uml邏輯關係圖,即使不畫也要在電腦上還是紙上整理好思路,準備怎麼實現思路每一步都寫出來,然後執行頁面->sql->資料庫,當然資料庫返回頁面也是這個思路。
首先,整體頁面佈局用最簡單的Gird佈局(檢視我整理好的相關Gird佈局的用法,簡單到直接複製到專案中使用)方式給整一下,再在整個佈局中畫控制元件,畫控制元件可以去微軟的Blend for Visual Studio 去畫,也可以直接手擼程式碼。
關於HashTable的用法
在所有的控價整理好後,可以考慮把需要收集的頁面的值裝入一個HashTable中,如下:
1 private Hashtable myhashtable = new Hashtable();//存放介面元素存放的總表
這樣很有好處,好處在於使用雜湊表定義後,使用下面語法新增相關頁面的各個值:
1 myhashtable.Clear();//清理所有鍵值對 2 myhashtable.Add("鍵名", 對應值); 3 myhashtable.Add(Key, Value); //新增鍵值
以下是hashtable的遍歷和檢索功能
遍歷hashtable可以用到如下程式碼:
1 foreach (DictionaryEntry de in hashtable) //ht為一個Hashtable例項 2 { 3 MessageBox.Show(string.Format("{0},{1}",de.Key.ToString(),de.Value.ToString()));
//de.Key對應於keyvalue鍵值對key4 }
也可以遍歷值
//遍歷值 foreach (string value in hashtable.Values) { messagebox.show(value); }
以上程式碼可以檢查出hashtable中的每一個鍵值,用來檢驗hash表中相關的欄位和值有沒有出問題。
檢查出沒出問題了,那麼就可以開始使用了,注意以下用法:
1 myhashtable["keyname"]//訪問該鍵對應的值,這個無疑是重要的 2 myhashtable.remove("keyname")//移除指定的值 3 HashtableObject.Contains("kayname");// 判斷是否包含特定鍵key 4 string value = myhashtable["keyname"] as string;//hashtable轉換為字串 5 string value = (string)myhashtable["keyname"] ;//hashtable轉換為字串
有時會用到排序:
//對雜湊表進行排序 //對雜湊表按key值重新排列的做法: ArrayList akeys=new ArrayList(myhashtable.Keys); akeys.Sort(); //按字母順序進行排序 foreach(string key in akeys) { MessageBox.show(key + ": " + myhashtable[key]); //排序後輸出 }
到此步HashTable已經把頁面相關資訊裝好了,並且可以用上面提供的方法去使用裝入表中的資料,接下來就是呼叫hash表中資料,形成SQL語句字串再呼叫相應的AOD執行函式ExecuteQuery執行,執行後會返回一個DataTable類,這很明顯不是我們想要的,我們需要一個返回HashTable的類ExecuteReturnHashQuery,現在把倆個函式載錄一下,供需要的人去使用:
ExecuteQuery:
public static DataTable ExecuteQuery(string sql) { //略去連線字串,開啟連線,建立Command物件等基本操作,載錄核心程式碼 cmd.CommandText = sql; SqlDataAdapter adapter = new SqlDataAdapter(cmd); DataTable dt = new DataTable(); adapter.Fill(dt); cmd.Connection.Close(); return dt; }
ExecuteReturnHashQuery:
public static Hashtable ExecuteReturnHashQuery(string sql, Hashtable ht) { SqlCommand cmd = Cmd; cmd.CommandText = sql; SqlDataAdapter adapter = new SqlDataAdapter(cmd); DataTable dt = new DataTable(); adapter.Fill(dt); cmd.Connection.Close(); //Datatable轉Hashtable makehashtable.DTableToHashTable(dt,ht); return ht; }
ExecuteReturnHashQuery其中的DTableToHashTable函式:
public static Hashtable DTableToHashTable(DataTable dt, Hashtable hashtable) { DataRow row = dt.Rows[0];//專門用於一行資料的datatable物件轉為相應的hashtable方便進行鍵值轉換 for (int i = 0; i < row.Table.Columns.Count; i++) { hashtable.Add(row.Table.Columns[i].ColumnName, row[i].ToString()); } return hashtable; }
之後,把已經執行函式並且返回的hashtable呼叫下面函式儲存入資料庫:
public static void SaveHashToDb(Hashtable hashtable, string InsertTable) { int b = hashtable.Count; string[] fields = new string[b]; string[] values = new string[b]; for (int i = 0; i < b; i++) { foreach (DictionaryEntry de in hashtable) //ht為一個Hashtable例項 { fields[i] = de.Key.ToString(); //de.Key對應於keyvalue鍵值對key values[i] = de.Value.ToString(); //de.Key對應於keyvalue鍵值對value i++; } } //呼叫處理sql語句的SqlStringHelper類中的插入欄位函式,該函式需要 欄位名,欄位值,要插入的表。 string insertsql = SqlStringHelper.MakeInsertSql(fields, values, InsertTable); SQLServerConnect.ExecuteNonQuery(insertsql); }
注意:SqlStringHelper.MakeInsertSql拼接sql語句可以使用,ExecuteNonQuery為執行非查詢類的sql語句下面一併給出相關函式:
SqlStringHelper.MakeInsertSql方法:
1 public static string MakeInsertSql(string[] fields, string[] values, string table) 2 { 3 string strInsertFld = ""; 4 string strInsertVal = ""; 5 for (int i = 0; i < fields.Length; i++) 6 { 7 string key = fields[i]; 8 string val = values[i]; 9 if (val == null) val = ""; //為了容錯性,將沒有的引數都當做空 10 val = val.Replace("'", ""); //為了避免sql注入問題,將單引號全部去掉 11 12 strInsertFld += key + ","; 13 strInsertVal += "'" + val + "',"; 14 } 15 string strInsert = "insert into " + table + "( " + strInsertFld.TrimEnd(',') + " ) values (" + strInsertVal.TrimEnd(',') + ")"; 16 17 return strInsert; 18 }
ExecuteNonQuery
public static int ExecuteNonQuery(string sql) { SqlCommand cmd = Cmd; cmd.CommandText = sql; int result = cmd.ExecuteNonQuery(); cmd.Connection.Close(); return result; }
//略去連線字串,開啟連線,建立Command物件等基本操作,載錄核心程式碼
最後把相關資料庫繫結到介面中的DataGird上,只需要一句程式碼就能搞定:
DataGirdObject.ItemsSource = SQLServerConnect.ExecuteQuery(queryallsql).DefaultView;
ExecuteQuery函式:
public static DataTable ExecuteQuery(string sql) { SqlCommand cmd = Cmd; cmd.CommandText = sql; SqlDataAdapter adapter = new SqlDataAdapter(cmd); DataTable dt = new DataTable(); adapter.Fill(dt); cmd.Connection.Close(); return dt; }