[轉貼] DataTable常用操作總結

2012081622:11
出處:http://www.cnblogs.com/LiveStar/archive/2009/01/14/1375774.html

protected void Page_Load(object sender, EventArgs e)
{
//①Create a DataTable
DataTable dt = new DataTable("Table_AX");

//②Add columns for DataTable
//Method 1
dt.Columns.Add("column0", System.Type.GetType("System.String"));
//Method 2
DataColumn dc = new DataColumn("column1", System.Type.GetType("System.Boolean"));
dt.Columns.Add(dc);

//③Add rows for DataTable
//★Initialize the row
DataRow dr = dt.NewRow();
dr[
"column0"] = "AX";
dr[
"column1"] = true;
dt.Rows.Add(dr);
//★Doesn't initialize the row
DataRow dr1 = dt.NewRow();
dt.Rows.Add(dr1);

//④Select row
//Search the second row 如果沒有賦值,則用is null來select
DataRow[] drs = dt.Select("column1 is null");
DataRow[] drss
= dt.Select("column0 = 'AX'");


//⑤Copy DataTable include data
DataTable dtNew = dt.Copy();

//⑥Copy DataTable only scheme
DataTable dtOnlyScheme = dt.Clone();

//⑦Operate one row
//★都是對dt的操作
//Method 1
DataRow drOperate = dt.Rows[0];
drOperate[
"column0"] = "AXzhz";
drOperate[
"column1"] = false;
//Method 2
drOperate[0] = "AXzhz";
drOperate[
1] = false;
//Method 3
dt.Rows[0]["column0"] = "AXzhz";
dt.Rows[
0]["column1"] = false;
//Method 4
dt.Rows[0][0] = "AXzhz";
dt.Rows[
0][1] = false;

//⑧Evaluate another DataTable's row to current Datatable
dtOnlyScheme.Rows.Add(dt.Rows[0].ItemArray);

//⑨Use Rowstate
//■■■■■■■■■■■■■■■■■■■■■■■■■■■■
//不知道怎麼才能使Row的State變為DataRowState.Deleted
//More further,怎樣設置Row的State
//■■■■■■■■■■■■■■■■■■■■■■■■■■■■
if (dt.Rows[0].RowState == DataRowState.Unchanged)
{
//Your logic
}


//⑩Convert to string
System.IO.StringWriter sw = new System.IO.StringWriter();
System.Xml.XmlTextWriter xw
= new System.Xml.XmlTextWriter(sw);
dt.WriteXml(xw);
string s = sw.ToString();

//ⅰ.string convert to DataTable【Doesn't achieve it】
//■■■■■■■■■■■■■■■■■■■■■■■■■■■■
//沒有把string成功轉換為DataTable ■■已實現,參見追加■■
//■■■■■■■■■■■■■■■■■■■■■■■■■■■■
//DataTable dtConvert = new DataTable();
//System.IO.StringReader stream = new System.IO.StringReader(s);
//System.Xml.XmlReader xtr = new System.Xml.XmlTextReader(stream);
//dtConvert.ReadXml(xtr);

//ⅱ.Filter DataTable
//It's so strange that the second row has been filtered
//the second row show in GridView never
//It means null field will be filter always.
//Filter the all conditions
dt.DefaultView.RowFilter = "column1 <> true";
//dt.DefaultView.RowFilter = "column1 = true";

dt.DefaultView.RowStateFilter
= DataViewRowState.Added;

//ⅲ.Sort row
//Stupid method
DataRow[] drsss = dt.Select(String.Empty, "column0 DESC , column1 ASC");
//Clever method
dt.DefaultView.Sort = "column0 , column1 ASC";

//ⅳ.Bind DataTable
//綁定的其實是DefaultView
gvTestDataTable.DataSource = dt;
gvTestDataTable.DataBind();
}

【追加】判斷一個字符串是否為DataTable的列名
dtInfo.Columns.Contains("AX");

【追加】DataTable與XML的轉換
protected void Page_Load(object sender, EventArgs e)
{
DataTable dt_AX
= new DataTable();

//dt_AX.Columns.Add("Sex", typeof(System.Boolean));
//DataRow dr = dt_AX.NewRow();
//dr["Sex"] = true;
//dt_AX.Rows.Add(dr);

string xml=ConvertBetweenDataTableAndXML_AX(dt_AX);
DataTable dt
= ConvertBetweenDataTableAndXML_AX(xml);
}


public string ConvertBetweenDataTableAndXML_AX(DataTable dtNeedCoveret)
{
System.IO.TextWriter tw
= new System.IO.StringWriter();
//if TableName is empty, WriteXml() will throw Exception.
dtNeedCoveret.TableName=dtNeedCoveret.TableName.Length==0?"Table_AX":dtNeedCoveret.TableName;
dtNeedCoveret.WriteXml(tw);
dtNeedCoveret.WriteXmlSchema(tw);
return tw.ToString();
}


public DataTable ConvertBetweenDataTableAndXML_AX(string xml)
{
System.IO.TextReader trDataTable
= new System.IO.StringReader(xml.Substring(0, xml.IndexOf("")));
System.IO.TextReader trSchema
= new System.IO.StringReader(xml.Substring(xml.IndexOf("")));
DataTable dtReturn
= new DataTable();
dtReturn.ReadXmlSchema(trSchema);
dtReturn.ReadXml(trDataTable);
return dtReturn;
}
【追加】排序的好方法
dt.DefaultView.Sort = "ID ,Name ASC";
dt
=dt.DefaultView.ToTable();

            //排序
            dt.DefaultView.Sort = "ID DESC, Name";

            //過濾
            dt.DefaultView.RowFilter = "ID > 100 AND Name = 'coolong'";

            //刪除多餘欄位
            dt.Columns.Remove("欄位名稱");

            //搭配 Dictionary 記錄Row ID及DataTable筆數索引值,可隨時再修改某一筆資料
            Dictionary<string, string> dicBS = new Dictionary<string, string>();