你的位置:首页 > ASP.net教程

[ASP.net教程]WinForm中DataGridView显示更新数据


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;

引用
选择DataGridView中的某一行,离开后,若数据变化则更新到数据库,若没变则不做操作.精髓部分:当点击一个单元格,如果已经换了行并且数据改变,会更新数据到数据库,并从数据库加载数据,再把之前点击的那个单元格设为选定状态,使得操作体验良好.代码如下:

 1 namespace UI 2 { 3   public partial class FormStockList : Form 4   { 5     public FormStockList() 6     { 7       InitializeComponent(); 8       this.dgvStockList.AutoGenerateColumns = false;//自动产生列设置为false; 9     } 10  11     //加载商品ID的下拉列表的数据源和DGV的数据源. 12     private void FormStockList_Load(object sender, EventArgs e) 13     { 14       //把DataGridView中名为goodsId的下拉列表列取出来,设置重要属性. 15       DataGridViewComboBoxColumn col = this.dgvStockList.Columns["goodsId"] as DataGridViewComboBoxColumn; 16       col.DataSource = new BLL.GoodsBLL().GetModelList(""); 17       col.DisplayMember = "Name"; 18       col.ValueMember = "GoodsId"; 19       col.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing; 20  21       LoadDataByPageIndex();//加载DataGridView的数据源. 22     } 23  24     int cellRowIndex;//全局变量,存储单元格行号 25     int cellColumnIndex;//全局变量,存储单元格列号 26      27     int PreSelectRowIndex;//存储行号,以后用来判断是否换行. 28     bool isFirstSelectRow = true;//标识是否给变量PreSelectRowIndex赋过值.没为PreSelectRowIndex赋过值,则为true. 29     private void dgvStockList_CellClick(object sender, DataGridViewCellEventArgs e) 30     { 31       //DataGridView dgv = (DataGridView)sender; 32       cellRowIndex = this.dgvStockList.CurrentCell.RowIndex;//为cellRowIndex赋值 33       cellColumnIndex = this.dgvStockList.CurrentCell.ColumnIndex;//为cellColumnIndex赋值 34       if (isFirstSelectRow)//若isFirstSelectRow为true,说明PreSelectRowIndex是未赋过值 35       { 36         PreSelectRowIndex = e.RowIndex;//把当前行号赋值给PreSelectRowIndex 37         isFirstSelectRow = false;//说明已经给PreSelectRowIndex赋值 38       } 39       else//如果已经给PreSelectRowIndex赋值 40       { 41         if (e.RowIndex != PreSelectRowIndex)//当前选的单元格的行号和存储的行号不一样,说明换行了. 42         { 43           PreSelectRowIndex = e.RowIndex;//存储新行的行号. 44           SelectionRowChanged();//换行时要执行的方法.可能或重新绑定dgvStockList的数据源. 45           this.dgvStockList.Rows[cellRowIndex].Cells[cellColumnIndex].Selected = true;//针对可能重新绑定dgvStockList的数据源的情况,重新设置当前选中的单元格为重新绑定数据源前用户已选的单元格. 46         } 47       } 48       this.dgvStockList.BeginEdit(true);//dgvStockList_CellClick点击事件会选择一个单元格,BeginEdit让当前单元格可以编辑,能触发dgvStockList_CellBeginEdit事件. 49     } 50  51     ////换行时判断是否值有变化,如果有,就把行数据更新到数据库.重新加载数据源. 52     private void SelectionRowChanged() 53     { 54       if (isEdit)//判断该行是否编辑过 55       { 56         if (temp.GoodsId != stock.GoodsId || temp.SCount != stock.SCount || temp.StockPrice != stock.StockPrice)//判断编辑过后该行的数据是否改变,如果改变了,就更新数据到数据库. 57         { 58           new BLL.StockBLL().Update(stock);//把变动后的行数据更新到数据库.           59           LoadDataByPageIndex();//重新加载dgvStockList的数据源. 60         } 61       } 62       isEdit = false;//重置isEdit的状态. 63       isFirst = true;//重置isFirst的状态. 64     } 65  66     Model.Stock stock = null;//存储变动后的行数据的实体对象. 67     Model.Stock temp = null;//存储变动前的行数据的实体对象 68     bool isFirst = true;//标识是否是第一次编辑该行. 69     bool isEdit = false;//标识一行是否被编辑过.如果没有,以后就不用更新行数据到数据库. 70  71     private void dgvStockList_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e) 72     { 73       isEdit = true;//标识该行被编辑. 74       stock = this.dgvStockList.SelectedRows[0].DataBoundItem as Model.Stock;//把该行的对象用存入变量stock 75       if (isFirst)//如果是第一次要开始编辑该行,即该行还没有被编辑过. 76       { 77         temp = new Model.Stock();//存储该行最初的数据. 78         temp.GoodsId = stock.GoodsId; 79         temp.SCount = stock.SCount; 80         temp.StockPrice = stock.StockPrice; 81         isFirst = false;//标识该行不再是第一次被编辑了. 82       } 83     } 84     int pageIndex = 1;//页索引 85     int pageCount = 4;//每页显示几条数据 86     private void LoadDataByPageIndex() 87     { 88       this.dgvStockList.DataSource = new BLL.StockBLL().GetStockListByPage(pageIndex, pageCount); 89     }//加载dgvStockList的数据. 90  91     //点击上一页 92     private void btnPre_Click(object sender, EventArgs e) 93     { 94       pageIndex--; 95       if (pageIndex < 1) 96       { 97         MessageBox.Show("已经第一页了"); pageIndex++; return; 98       } 99       LoadDataByPageIndex();100     }101 102     //点击下一页103     private void btnNext_Click(object sender, EventArgs e)104     {105       pageIndex++;106       if (pageIndex > Model.Save.TPageCount)//Model.Save.TPageCount存的是总的页数.107       {108         MessageBox.Show("已经最后一页了"); pageIndex--; return;109       }110       LoadDataByPageIndex();111     }112   }113 }