ADO.Net中DataTable
知识点描述
DataTable是一个临时保存数据的网格虚拟表(表示内存中数据的一个表。)。DataTable是ADO dot net 库中的核心对象。它可以被应用在 VB 和 ASP 上。
当访问DataTable对象时,请注意它们是按条件区分大小写的。例如,如果一个DataTable被命名为“mydatatable”,另一个被命名为“Mydatatable”,则用于搜索其中一个表的字符串被认为是区分大小写的。但是,如果“mydatatable”存在而“Mydatatable”不存在,则认为该搜索字符串不区分大小写。一个DataSet可以包含数个DataTable对象,它们具有相同的TableName属性值和不同的Namespace属性值。
思维导图
属性
名称 | 说明 | |
---|---|---|
CaseSensitive | 指示表中的字符串比较是否区分大小写。 | |
ChildRelations | 获取此 DataTable 的子关系的集合。 | |
Columns | 获取属于该表的列的集合。 | |
Constraints | 获取由该表维护的约束的集合。 | |
Container | 获取组件的容器。 (继承自 MarshalByValueComponent。) | |
DataSet | 获取此表所属的 DataSet。 | |
DefaultView | 获取可能包括筛选视图或游标位置的表的自定义视图。 | |
DesignMode | 获取指示组件当前是否处于设计模式的值。 (继承自 MarshalByValueComponent。) | |
DisplayExpression | 获取或设置一个表达式,该表达式返回的值用于表示用户界面中的此表。 DisplayExpression 属性用于在用户界面中显示此表的名称。 | |
Events | 获取附加到该组件的事件处理程序的列表。 (继承自 MarshalByValueComponent。) | |
ExtendedProperties | 获取自定义用户信息的集合。 | |
HasErrors | 获取一个值,该值指示该表所属的 DataSet 的任何表的任何行中是否有错误。 | |
IsInitialized | 获取一个值,该值指示是否已初始化 DataTable。 | |
Locale | 获取或设置用于比较表中字符串的区域设置信息。 | |
MinimumCapacity | 获取或设置该表最初的起始大小。 | |
Namespace | 获取或设置 DataTable 中所存储数据的 XML 表示形式的命名空间。 | |
ParentRelations | 获取该 DataTable 的父关系的集合。 | |
Prefix | 获取或设置 DataTable 中所存储数据的 XML 表示形式的命名空间。 | |
PrimaryKey | 获取或设置充当数据表主键的列的数组。 | |
RemotingFormat | 获取或设置序列化格式。 |
方法
名称 | 说明 | |
---|---|---|
AcceptChanges | 提交自上次调用 AcceptChanges 以来对该表进行的所有更改。 | |
BeginInit | 开始初始化在窗体上使用或由另一个组件使用的 DataTable。 初始化发生在运行时。 | |
BeginLoadData | 在加载数据时关闭通知、索引维护和约束。 | |
Clear | 清除所有数据的 DataTable。 | |
Clone | 克隆 DataTable 的结构,包括所有 DataTable 架构和约束。 | |
Compute | 计算用来传递筛选条件的当前行上的给定表达式。 | |
Copy | 复制该 DataTable 的结构和数据。 | |
CreateDataReader | 返回与此 DataTable 中的数据相对应的 DataTableReader。 | |
CreateInstance | 基础结构。创建 DataTable 的一个新实例。 | |
Dispose() | 释放由 MarshalByValueComponent 使用的所有资源。 (继承自 MarshalByValueComponent。) | |
Dispose(Boolean) | 释放由 MarshalByValueComponent 占用的非托管资源,还可以另外再释放托管资源。 (继承自 MarshalByValueComponent。) | |
EndInit | 结束在窗体上使用或由另一个组件使用的 DataTable 的初始化。 初始化发生在运行时。 | |
EndLoadData | 在加载数据后打开通知、索引维护和约束。 | |
Equals(Object) | 确定指定的对象是否等于当前对象。 (继承自 Object。) |
DataTable 事件
名称 | 说明 | |
---|---|---|
ColumnChanged | 在 DataRow 中指定的 DataColumn 的值被更改后发生。 | |
ColumnChanging | 在 DataRow 中指定的 DataColumn 的值发生更改时发生。 | |
Disposed | 添加事件处理程序以侦听组件上的 Disposed 事件。 (继承自 MarshalByValueComponent。) | |
Initialized | 初始化 DataTable 后发生。 | |
RowChanged | 在成功更改 DataRow 之后发生。 | |
RowChanging | 在 DataRow 正在更改时发生。 | |
RowDeleted | 在表中的行已被删除后发生。 | |
RowDeleting | 在表中的行要被删除之前发生。 | |
TableCleared | 清除 DataTable 后发生。 | |
TableClearing | 清除 DataTable 后发生。 | |
TableNewRow | 插入新 DataRow 时发生。 |
代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Configuration;
namespace DatabaseHomework
{
public partial class Drugs_Form : Form
{
private DataTable DrugsTable;
private DataView DrugsViewByName;
public Drugs_Form()
{
InitializeComponent();
}
private void btn_Read_Click(object sender, EventArgs e)
{
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Sql"].ConnectionString);
conn.Open();
SqlCommand cmd = new SqlCommand("select* from tb_Drugs",conn);
SqlDataAdapter sqlDataAdapter = new SqlDataAdapter();
sqlDataAdapter.SelectCommand = cmd;
sqlDataAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
this.DrugsTable = new DataTable();
sqlDataAdapter.Fill(DrugsTable);
conn.Close();
this.DrugsViewByName = new DataView();
DrugsViewByName.Table = DrugsTable;
DrugsViewByName.Sort = "Name ASC";
dgv_Drugs.Columns.Clear();
dgv_Drugs.DataSource = DrugsTable;
dgv_Drugs.Columns["No"].HeaderText = "编号";
dgv_Drugs.Columns["Name"].HeaderText = "姓名";
dgv_Drugs.Columns["Price"].HeaderText = "单价";
dgv_Drugs.Columns["Pinyin"].Visible = false;
DataGridViewComboBoxColumn preCourseColumn = new DataGridViewComboBoxColumn();
preCourseColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
this.dgv_Drugs.Columns[this.dgv_Drugs.Columns.Count - 1].AutoSizeMode =
DataGridViewAutoSizeColumnMode.Fill;
}
private void Drugs_Form_Load(object sender, EventArgs e)
{
this.dgv_Drugs.AllowUserToAddRows = false; //数据网格视图不允许用户添加行;
this.dgv_Drugs.RowHeadersVisible = false; //数据网格视图的行标题不可见;
this.dgv_Drugs.BackgroundColor = Color.White; //数据网格视图的背景色设为白色;
this.dgv_Drugs.AutoSizeColumnsMode =
DataGridViewAutoSizeColumnsMode.AllCells;
}
private void txt_Pinyin_TextChanged(object sender, EventArgs e)
{
DataRow[] searchResultRows = this.DrugsTable.Select("Pinyin LIKE '%" + txt_Pinyin.Text.Trim() + "%'");
DataTable searchResultTable = this.DrugsTable.Clone();
foreach (DataRow row in searchResultRows)
{
searchResultTable.ImportRow(row);
}
dgv_Drugs.DataSource = searchResultTable;
}
private void btn_GNo_Click(object sender, EventArgs e)
{
DataRow searchResultRow = this.DrugsTable.Rows.Find(txt_GNo.Text.Trim());
DataTable searchResultTable = DrugsTable.Clone();
searchResultTable.ImportRow(searchResultRow);
dgv_Drugs.DataSource = searchResultTable;
}
private void btn_GName_Click(object sender, EventArgs e)
{
DataRowView[] searchResultRowViews =
this.DrugsViewByName.FindRows(txt_GName.Text.Trim()); //借助本窗体的按名称排序的课程数据视图的方法FindRows,根据排序列(即课程名称)快速查找相应课程;由于该列并非主键,可能返回多行查询结果,故返回数据行视图数组;数据行视图数组不能直接作为数据源,需转为列表后方可作为数据源;
DataTable searchResultTable = this.DrugsTable.Clone(); //借助本窗体的课程数据表的方法Clone,创建相同架构的空表,用于保存搜索结果所在数据行;
foreach (DataRowView dataRowView in searchResultRowViews) //遍历搜索结果所在数据行视图数组;
{
searchResultTable.ImportRow(dataRowView.Row); //通过每条数据行视图的属性Row获取相应的数据行,并导入数据表;
}
this.dgv_Drugs.DataSource = searchResultTable; //将数据网格视图的数据源设为搜索结果数据表;
}
}
}