C# DataTable常用操作总结 (转载)

转载自:http://wxm337766.blog.163.com/blog/static/2231955200952904413984/

【引言】项目中经常使用DataTable,发现有好多东西,需要整理下.

protected void Page_Load(object sender, EventArgs e)
{
    //①Create a DataTable.创建一个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,包括数据
    DataTable dtNew = dt.Copy();

    //⑥Copy DataTable only scheme 复制DataTable,只有结构
    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 复制另一个DT的行数据到当前DT
    dtOnlyScheme.Rows.Add(dt.Rows[0].ItemArray);

    //⑨Use Rowstate RowState属性的操作
    //■■■■■■■■■■■■■■■■■■■■■■■■■■■■
    //不知道怎么才能使Row的State变为DataRowState.Deleted
    //More further,怎样设置Row的State
    //■■■■■■■■■■■■■■■■■■■■■■■■■■■■
    if (dt.Rows[0].RowState == DataRowState.Unchanged)
    {
        //Your logic
    }

    //⑩Convert to string 将DT转换成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("<?xml")));
    System.IO.TextReader trSchema = new System.IO.StringReader(xml.Substring(xml.IndexOf("<?xml")));
    DataTable dtReturn = new DataTable();
    dtReturn.ReadXmlSchema(trSchema);
    dtReturn.ReadXml(trDataTable);
    return dtReturn;
}

【追加】排序的好方法

dt.DefaultView.Sort = "ID ,Name ASC";
dt = dt.DefaultView.ToTable();

转载自:http://wxm337766.blog.163.com/blog/static/2231955200952904413984/

posted @ 2012-11-23 09:39  脸谱匠  阅读(776)  评论(0编辑  收藏  举报