zoukankan      html  css  js  c++  java
  • 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 }
     
    人是有思想的,这是人与动物本质的区别。人的社会属性要求我们在操守的规范下实现自我价值,越有这越给予。因此,我们要实现自己的社会价值 。这些都离不开坚定的信仰,有无信仰是一个在精神层面状态好坏的体现,不能觉得一切都无所谓。生活是一面镜子,自己是什么样子很快现行。 用知识武装自己,用信仰升华自己,用爱好装点自己,用个性标识自己。 我就是我,不一样的烟火;我就是我,不一样的水果;我就是我,不一样的花朵;我就是我,不一样的自我。 生活寄语:越努力,越幸运。 做最好的自己!
  • 相关阅读:
    Python3小练习2——(汉诺塔的移动),递归
    Python3小练习1——(ax*x+ bx + c = 0的解)
    SSRS数据导出Excel多出空白列
    ETL 压缩文件(makecab) 并邮件发送
    关于System.Web.Script.Serialization命名空间的引用
    如何通过VIsual Studio安装程序修改VS2017?
    如何其他服务器能够连接自己本机的数据库?
    SSAS表格模型部署问题
    表格模型——安装实例
    Leetcode 76题:最小覆盖子串 滑动窗口经典题
  • 原文地址:https://www.cnblogs.com/hyd1213126/p/4510084.html
Copyright © 2011-2022 走看看