用 C# 访问 SQLite (2)
?
6. Form 与 DataGridView
?
在 Solutuon Explorer 点击 Form1.cs , 在打开的 Form1[Design] 添加控件
?
在 Toolbox 拉入4个 Label, 分别命名,例如:lblID, lblBookname, lblPrice, lblGuid
在 Toolbox 拉入4个 TextBox, 分别命名,例如: txtID, txtBookname, txtPrice, txtGuid
在 Toolbox 拉入2个 Button, 分别命名,例如: btnExit, btnSave
在 Toolbox 拉入1个 DataGridView, 命名,例如: dgv1
?
适当排列和布局,就可以达到这样的一个输入和现实界面:
?
?
当然,可以把 Form1 的尺寸调大,把各个控件的尺寸也放大一些。
?
双击 Form1 就会打开 Form1.cs 来输入语句。
?
在 Form1.cs[Design] 分别双击 btnExit , btnSave 和 dgv1 然后在 Form1.cs 输入相关的语句:
?
private void Form1_Load(object sender, EventArgs e) { initView1(); } private void btnExit_Click(object sender, EventArgs e) { Application.Exit(); } private void btnSave_Click(object sender, EventArgs e) { //find a GUID for new row to insert into DB StringBuilder guidSB = new StringBuilder(System.Guid.NewGuid().ToString()); guidSB.Replace("-", ""); //replace - string guidStr = guidSB.ToString(); //new book object Book book1 = new Book(); book1.ID = Convert.ToInt32(txtID.Text); book1.BookName = txtBookname.Text; book1.Price = Convert.ToDecimal(txtPrice.Text); book1.Rowguid = guidStr; //save to DB BookDAL.CreateBook(book1); //Read the rows from DB and display in dgv initView1(); } private void dgv1_CellContentClick(object sender, DataGridViewCellEventArgs e) { } //=================================================== // Click a row to dusplay its field in textbox //=================================================== private void dgv1_CellClick(object sender, DataGridViewCellEventArgs e) { if (e.RowIndex < 0) return; if (e.ColumnIndex < 0) return; int rowIndx = dgv1.CurrentCell.RowIndex; txtID.Text = this.dgv1[0, e.RowIndex].Value.ToString(); //column 0 txtBookname.Text = this.dgv1[1, e.RowIndex].Value.ToString(); //column 1 txtPrice.Text = this.dgv1[2, e.RowIndex].Value.ToString(); //column 2 txtGuid.Text = this.dgv1[3, e.RowIndex].Value.ToString(); //column 3 } //=================================================== // init the data view: datagridview and text boxes //=================================================== private void initView1() { dgv1.DataSource = null; DataTable dt1 = new DataTable(); dt1 = BookDAL.GetAllBook(); if (dt1.Rows.Count > 0) { dgv1.DataSource = dt1; } }?
这里需要特别说明的是 DataGirdView 的点击事件。我们希望 点一下 DataGridView 的任一单元格, 就把这行的数据显示到 TextBox 对应项。
?
在 dgv1 双击 会产生这个事件控制段:
?
private void dgv1_CellContentClick(object sender, DataGridViewCellEventArgs e) { }?
但是,这个 CellContentClick 控制不是对Cell 点击的控制,在其中加入代码,在 鼠标点击 Cell (单元格) 时不会触发这个事件。所以,我们要手工加入 CellClick 的事件控制:
?
private void dgv1_CellClick(object sender, DataGridViewCellEventArgs e) { if (e.RowIndex < 0) return; if (e.ColumnIndex < 0) return; int rowIndx = dgv1.CurrentCell.RowIndex; txtID.Text = this.dgv1[0, e.RowIndex].Value.ToString(); //column 0 txtBookname.Text = this.dgv1[1, e.RowIndex].Value.ToString(); //column 1 txtPrice.Text = this.dgv1[2, e.RowIndex].Value.ToString(); //column 2 txtGuid.Text = this.dgv1[3, e.RowIndex].Value.ToString(); //column 3 }
?
这样就可以了吗?还不行。
?
因为 这个 CellClick 是你自己加入的,还不能被识别,需要在 Form1.Designer.cs 加入这个 CellClick 的识别:
?
在 Solution Explorer 在 Form1.cs 下面, 点 Form1.Designer.cs, 点? Open
?
?
点一下 “Windows Form Designer generated code” 前面的 + 号 ,就展开各控件的定义设置语句。
?
在 dgv1 下加入 CellClick 的定义:
?
?
保存,关闭 Form1.Designer.cs 即可。
?
这是很重要的一步,在网上多数的例子都是列出数据库操作语句,而这个设置就没有特别说明。我就是在网上搜索了很多例子,最后是在 msdn 论坛发问,才得到指点,而添加这一行来控制 单元格的点击操作。
?
其他的数据库操作,例如 插入,更新,删除,等等,可以看网上的例子。
?
?
7. SQLite ADO.NET 版本问题
?
现在可以调试一下,看看运行的效果:
?
在 VS 菜单,Debug -> Start Debugging
?
就会看到一个 Mixed mode 错误。原因么,就是因为这个 SQLite ADO.NET 是支持 2.0 runtime 的, 而我们现在是在 .NET 4.0 环境下来使用,所以需要特别的设置。
?
那特别的设置在哪里呢? 在 App.config 文件, 而这个文件缺省并不存在,需要手工添加:
?
先关闭 调试状态, Debug -> Stop Debugging
?
在 Solution Explorer 点 项目名, 按鼠标右键,选 Add -> New Item
?
?
在弹出的对话框,点选Application Configuration File, 然后点 Add 添加。
?
?
在打开的 App.config 编辑窗口,加入一行:
?
<startup useLegacyV2RuntimeActivationPolicy="true"><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup>
?
?
保存,关闭 App.config 即可。
?
再试运行一下吧:
?
?
现在可以了。在 各个 textbox 输入数据,然后点 Save 数据就插入 数据库,并在 Datagridview 显示出来。点击 Datagridview 的任一单元格,这行的数据就显示到 textbox 可供编辑。
?
这样一个很简单的 SQLite 数据库操作就完成了。但是,以上的操作还是太简单,需要添加的功能太多了,可以参考网上的很多例子来逐步完善。
?
?
:-