WinForm中DataGridView显示更新数据--人性版

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 }
 

你可能感兴趣的:(datagridview)