1. 程式人生 > 其它 >使用WPF實現頁面資料到資料庫再繫結DataGird控制元件相關技術總結

使用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鍵值對key
4 }

也可以遍歷值

//遍歷值

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;

        }