DataTable
[一篮饭特稀原创,转载请注明出处http://www.cnblogs.com/wanghafan/archive/2012/05/07/2487635.html]
删除行
View Code
1 protected void deleteDataRow(int RowID,DataTable dt) 2 { 3 for (int i = dt.Rows.Count - 1; i >= 0; i--) 4 { 5 if (Convert.ToInt32(dt.Rows[i]["RowID"]) == RowID) 6 dt.Rows.RemoveAt(i); 7 } 8 }
批量删除行
View Code
1 DataTable dt = new DataTable(); 2 int len = dt.Rows.Count; 3 for (int i = len; i >=0; i--) 4 { 5 if (((CheckBox)Rp.Items[i].FindControl("CB")).Checked) 6 { 7 dt.Rows[i].Delete(); 8 } 9 } 10 dt.AcceptChanges(); //提交对表进行的修改
错误 该行已经属于另一个表
View Code
1 从一个TABLE中取一行放到另一个TABLE里报错: 该行已经属于另一个表。 2 DataTable dt = new DataTable(); 3 4 dt = ds.Tables[0].Clone(); //克隆结构传递给dt 5 6 DataRow[] dr=dtOld["Product"].Select("ProjectID=1"); //通过条件得到符合条件的行 7 for(int i=0;i<dr.Length;i++) 8 { 9 //将数组元素加入表... 10 dt.Rows.Add(dr[i]); //出错提示为:该行已经属于另一个表 改成 dt.Rows.Add(dr[i].ItemArray); 11 }
对DataTable进行操作后如果赋值给DataSource务必要先AcceptChange
View Code
1 比如对DataTable进行排序后,如果直接复制给DataSource,会出现DataTable的所有行状态RowState==DataRowState.Added,使得在保存后不知不觉中出现双份数据导致键值冲突! 2 3 e.g. 4 DataView dv = dt_KeyWeightQuestionsTEO.DefaultView; 5 dv.Sort = "ParentID,OwnID"; 6 dt_KeyWeightQuestionsTEO = dv.ToTable(); 7 dt_KeyWeightQuestionsTEO.AcceptChanges(); <----- 关键 8 treeList.DataSource = dt_KeyWeightQuestionsTEO;
添加一自增列至首列
View Code
1 DataColumn dcIID=new DataColumn("IID", System.Type.GetType("System.Int32")); 2 dcIID.AutoIncrement = true; 3 dcIID.AutoIncrementSeed = 1; 4 dcIID.AutoIncrementStep = 1; 5 dcIID.ReadOnly = true; 6 dt.Columns.Add(dcIID);
利用 栈 实现 多行多次 撤销 Ctrl+Z
View Code
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Text; 7 using System.Windows.Forms; 8 using DevExpress.Utils.Commands; 9 10 namespace StackProgram 11 { 12 public partial class StackProgram : Form 13 { 14 private int stackLength = 3; //撤销上限 15 Stack<List<DataRow>> st_DataRow = new Stack<List<DataRow>>(); //栈 16 17 public StackProgram() 18 { 19 InitializeComponent(); 20 DataTable dt = new DataTable(); 21 dt.Columns.Add("IID", Type.GetType("System.Int32")); 22 dt.Columns.Add("IName", Type.GetType("System.String")); 23 for (int i = 1; i <= 5; i++) 24 { 25 DataRow dr = dt.NewRow(); 26 dr["IID"] = i; 27 dr["IName"] = "Name_"+i; 28 dt.Rows.Add(dr); 29 } 30 dt.AcceptChanges(); 31 gridControl1.DataSource = dt; 32 } 33 34 private void gridControl1_KeyDown(object sender, KeyEventArgs e) 35 { 36 if (e.Control && e.KeyCode.ToString().Equals("Z") && st_DataRow.Count > 0) 37 { 38 List<DataRow> li_dr = st_DataRow.Pop(); 39 if (li_dr.Count==1) //添加或修改或删除 40 { 41 if (li_dr[0].RowState.Equals(DataRowState.Added) || li_dr[0].RowState.Equals(DataRowState.Modified) || li_dr[0].RowState.Equals(DataRowState.Deleted)) 42 { 43 li_dr[0].RejectChanges(); 44 } 45 } 46 else //批量删除 47 { 48 foreach (DataRow dr in li_dr) 49 { 50 dr.RejectChanges(); 51 } 52 } 53 System.Windows.Forms.SendKeys.SendWait("{BS}"); //强制按下退格键可以取消该行的编辑状态!!! 54 } 55 } 56 57 private void gridControl1_EmbeddedNavigator_ButtonClick(object sender, DevExpress.XtraEditors.NavigatorButtonClickEventArgs e) 58 { 59 if (e.Button.Hint.Equals("添加")) 60 { 61 gridView1.AddNewRow(); 62 OverStack(); 63 List<DataRow> li_dr = new List<DataRow>(); 64 li_dr.Add(gridView1.GetDataRow(gridView1.FocusedRowHandle)); 65 st_DataRow.Push(li_dr); 66 } 67 if (e.Button.Hint.Equals("删除")) 68 { 69 OverStack(); 70 List<DataRow> li_dr = new List<DataRow>(); 71 foreach (int i in gridView1.GetSelectedRows()) 72 { 73 li_dr.Add(gridView1.GetDataRow(i)); 74 } 75 st_DataRow.Push(li_dr); 76 gridView1.DeleteSelectedRows(); 77 } 78 } 79 80 private void gridView1_CellValueChanged(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e) 81 { 82 if (!gridView1.GetDataRow(gridView1.FocusedRowHandle).RowState.Equals(DataRowState.Detached)) //新增的行立即修改时不能算作编辑的行 83 { 84 OverStack(); 85 List<DataRow> li_dr = new List<DataRow>(); 86 li_dr.Add(gridView1.GetDataRow(gridView1.FocusedRowHandle)); 87 st_DataRow.Push(li_dr); 88 } 89 } 90 91 private void OverStack() 92 { 93 if (st_DataRow.Count>0 && st_DataRow.Count >= stackLength) //大于栈空间时,删除栈底元素,更新栈顶元素 94 { 95 List<List<DataRow>> li_li_row = new List<List<DataRow>>(); 96 foreach (List<DataRow> li_dr in st_DataRow) //复制原有栈元素 97 { 98 li_li_row.Add(li_dr); 99 } 100 li_li_row.Reverse(); //反转 101 li_li_row.RemoveAt(0); //删除栈底元素 102 st_DataRow.Clear(); //清空所有栈元素 103 foreach (List<DataRow> li_dr in li_li_row) //重新入栈 104 { 105 st_DataRow.Push(li_dr); 106 } 107 } 108 } 109 } 110 }
DataView的RowFilter注入攻击
View Code
1 public static string EncodeString(string s) 2 { 3 StringBuilder sb = new StringBuilder(); 4 for (int i = 0; i < s.Length; i++) 5 { char c = s[i]; if (c == '*' || c == '%' || c == '[' || c == ']') 6 sb.Append("[").Append(c).Append("]"); else if (c == '\'') 7 sb.Append("''"); else 8 sb.Append(c); } return sb.ToString(); 9 } 10 11 dv.RowFilter = String.Format( 12 "名称='{0}' and 规格型号='{1}' and 单价='{2}' and 段ID='{3}' and 编码='{4}'", 13 Global.EncodeString(dr["名称"].ToString().Trim()), 14 Global.EncodeString(dr["规格型号"].ToString().Trim()), 15 Global.EncodeString(dr["单价"].ToString().Trim()), 16 dr["段ID"].ToString().Trim() == string.Empty ? "0" : dr["段ID"].ToString().Trim(), 17 Global.EncodeString(dr["编码"].ToString().Trim()) 18 );