使用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; }
浙公网安备 33010602011771号