DataTable / 搜尋 過濾 資料

摘要:DataTable / 搜尋 過濾 資料

1.如果我們想要在搜尋 DataTable 的資料,可以使用 Select 方法。

快照-2009102032713

2.Select 方法會回傳 DataRow 陣列

DataRow[] dr = myDataTable.Select(textBox1.Text);

 

 

3.Select 預設會以 Primary Key 的方式排序,若沒有 Primary Key 則以 DataRowCollection 順序為主,以下是為DataTable設定主鍵的方法

dt.PrimaryKey = new DataColumn[] { dt.Columns["EmployeeID"] };

4.降冪(由大排到小)用Desc,升冪(由小排到大)用Acs。

//升冪
DataRow[] dr = myDataTable.Select("", comboBox1.Text + " asc");
//降冪
DataRow[] dr = myDataTable.Select("", comboBox1.Text + " desc");

 

 

5.DataColumnSetOrdinal 方法可以變更 DataTable 的欄位,下例的EmployeeID欄位,原本是在0現在則把它變到1的位置

dt.Columns["EmployeeID"].SetOrdinal(1);

 

 

6.還可以利用 DataRowCollectionFind 方法來搜尋 DataRow 的資料,此法必須要設定Primary Key,否則會出錯哩。

DataTable dt = myDataTable;
//1.設定主鍵盤
dt.PrimaryKey = new DataColumn[] { dt.Columns[comboBox3.Text] };
//2.搜尋DataRow
DataRow dr = dt.Rows.Find(textBox5.Text.Trim());

 

7.如果我們有多個欄位要搜尋就傳陣列給它

DataTable dt = myDataTable;
//1.設定多個主鍵
dt.PrimaryKey = new DataColumn[] { dt.Columns[comboBox4.Text], dt.Columns[comboBox5.Text] };
//2.欲查詢的資料
object[] search = new object[] { textBox6.Text, textBox7.Text };
//3.搜尋DataRow
DataRow dr = dt.Rows.Find(search);

 

8.DataTableSelect方法因為需要維護Primary Key,若需要大量的Select DataTable,為了效能我們可以改用 DataView 。可參考以下:

[ADO.NET] 如何使用 DataView 物件(一) / 搜尋 過濾 資料

[ADO.NET] 如何使用 DataView 物件(二) / 新增 編輯 刪除 資料

 


9.在開始以下範例時,必須先引用以下兩個命名空間

System.Data

System.Data.SqlClient

 

取得北風資料庫中的Employees資料表,並建立一個DataTable,myDataTable就是我的 DataTable

private void Form1_Load(object sender, EventArgs e)
{
    cs = "Data Source=localhost;Initial Catalog=Northwind;Integrated Security=True";
    qs = "SELECT * FROM Employees";
    //資料庫連結,建立DataTable
    using (SqlConnection cn = new SqlConnection(cs))
    {
        cn.Open();
        using (SqlCommand cmd = new SqlCommand(qs, cn))
        {
            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                using (DataTable dt = new DataTable())
                {
                    dt.Load(dr);
                    myDataTable = dt;
                }
            }
        }
    }
}

 

如何使用Select 方法,查尋日期、資料、關鍵字


private void button1_Click(object sender, EventArgs e)
{
    DataRow[] dr = myDataTable.Select(textBox1.Text);
    this.dataGridView2.DataSource = SearchData(dr);
} 

private void button2_Click(object sender, EventArgs e)
{
    DataRow[] dr = myDataTable.Select(textBox2.Text);
    this.dataGridView2.DataSource = SearchData(dr);
} 

private void button3_Click(object sender, EventArgs e)
{
    DataRow[] dr = myDataTable.Select(textBox3.Text);
    this.dataGridView2.DataSource = SearchData(dr);
} 

private DataTable SearchData(DataRow[] dr)
{
    //建立新的DataTable
    DataTable dt = new DataTable();
    //建立新的DataTable Columns
    foreach (DataColumn dc in myDataTable.Columns)
    {
        dt.Columns.Add(dc.ToString());
        dt.Columns[dc.ToString()].DataType = dc.DataType;
    } 

    int i = 0;
    //讀取過濾的資料
    foreach (DataRow item in dr)
    {
        DataRow row = dt.NewRow();
        i = 0;
        foreach (DataColumn dc in myDataTable.Columns)
        {
            //建立DataRow的資料
            row[dc.ToString()] = item.ItemArray[i];
            i++;
        }
        dt.Rows.Add(row);
    }
    return dt;
}

如何使用Find方法搜尋資料(單一主鍵)

 


private void button7_Click(object sender, EventArgs e)
{
    DataTable dt = myDataTable;
    //1.設定主鍵盤
    dt.PrimaryKey = new DataColumn[] { dt.Columns[comboBox3.Text] };
    //2.搜尋DataRow
    DataRow dr = dt.Rows.Find(textBox5.Text.Trim());
    if (dr != null)
    {
        //3.將找到的資料放到另一個DataTable
        DataTable newdt = new DataTable();
        foreach (DataColumn column in dt.Columns)
        {
            newdt.Columns.Add(column.ToString());
        }
        DataRow newdr = newdt.NewRow();
        int i = 0;
        //讀取過濾的資料
        newdr = newdt.NewRow(); 

        foreach (var item in dr.ItemArray)
        {
            newdr[i] = dr.ItemArray[i];
            i++;
        }
        newdt.Rows.Add(newdr);
        this.dataGridView2.DataSource = newdt;
    }
    else
    {
        MessageBox.Show("找不到 " + textBox5.Text);
        this.dataGridView2.DataSource = null;
    }
}

如何使用Find方法搜尋資料(組合主鍵)


private void button8_Click(object sender, EventArgs e)
{
    DataTable dt = myDataTable;
    //1.設定多個主鍵
    dt.PrimaryKey = new DataColumn[] { dt.Columns[comboBox4.Text], dt.Columns[comboBox5.Text] };
    //2.欲查詢的資料
    object[] search = new object[] { textBox6.Text, textBox7.Text };
    //3.搜尋DataRow
    DataRow dr = dt.Rows.Find(search);
    if (dr != null)
    {
        //4.將找到的資料放到另一個DataTable
        DataTable newdt = new DataTable();
        foreach (DataColumn column in dt.Columns)
        {
            newdt.Columns.Add(column.ToString());
        }
        DataRow newdr = newdt.NewRow();
        int i = 0;
        //讀取過濾的資料
        newdr = newdt.NewRow(); 

        foreach (var item in dr.ItemArray)
        {
            newdr[i] = dr.ItemArray[i];
            i++;
        }
        newdt.Rows.Add(newdr);
        this.dataGridView2.DataSource = newdt;
    }
    else
    {
        MessageBox.Show("找不到 " + textBox6.Text + " 及 " + textBox7.Text);
        this.dataGridView2.DataSource = null;
    }
}