上面博客分享了DataGridView控件查的操作,查完之后按照套路就是增删改,没错,今天分享删的操作,也就是强制下机功能
设计知识点
- Datatable.GetChanges()方法
- Foreach循环
- DataRow.RowState属性
- 对删除行的取值
- 下机+存储过程
其实别看列的条多,也就是一行代码,接下来,咱们一个个来看
知识点
一、Datatable.GetChanges()方法
//存储自加载以来对数据表中所作的操作
DataTable changeDt =onlinetable.GetChanges();
正如注释所说,存储的操作有增删改,并以表的保存
红点便表示咱们删除的两行
二、foreach循环
foreach (DataRow dr in changeDt.Rows)
使用foreach循环去逐行遍历咱们刚刚操作的表,格式是
foreach(数据类型 标识符 in 表达式)
这里changeDt.Rows便是行的集合
三、DataRow.RowState属性
dr.RowState == System.Data.DataRowState.Deleted
刚才咱们说,操作有三个增删改,这里的操作就是行的状态,因此现在的状态是Deleted;
四、对删除行的取值
//onDate为online表字段
dr["onDate", DataRowVersion.Original]
因为删除行之后当前有可能为空,有可能是新的行,因此咱们需要取原来行的值也就是
DataRowVersion.Original,是取那个版本的值,有原始,当前,默认。
五、下机+存储过程
这个是下机的基础,是DAL层的操作,就不多说了
代码
private void btnSave_Click(object sender, EventArgs e)
{
//当前的每小时钱数
Facade.BasicdataFacade basicdataFacade = new Facade.BasicdataFacade();
DataTable basictable = basicdataFacade.SelectBasic();
string ratemoney = basictable.Rows[0]["rateMoney"].ToString().Trim();
//实例化下机
Facade.LineFacade lineFacade = new Facade.LineFacade();
Entity.LineEntity lineEntity = new Entity.LineEntity();
//存储自加载以来对数据表中所作的操作
DataTable changeDt =onlinetable.GetChanges();
if (changeDt==null)
{
MessageBox.Show("未删除上机用户", "温馨提示");
}
else
{
//使用循环逐行读取数据
foreach (DataRow dr in changeDt.Rows)
{
if (dr.RowState == System.Data.DataRowState.Deleted)
{
//调用算上机时长
int spenttime = DateDiff(Convert.ToDateTime(dr["onDate", DataRowVersion.Original]), DateTime.Now);
//算消费的金额
int spentcash = Convert.ToInt32(ratemoney) * spenttime;
Decimal balance = Convert.ToDecimal(dr["Balance", DataRowVersion.Original]) - spentcash;
lineEntity.CustID = dr["custID", DataRowVersion.Original].ToString();
lineEntity.OnDate = dr["onDate", DataRowVersion.Original].ToString();
lineEntity.OffDate = DateTime.Now.ToString();
lineEntity.ConsumeTime = spenttime;
lineEntity.ConsumeCash = spentcash;
lineEntity.Balance = balance;
lineEntity.Computer = System.Environment.MachineName;
int result = lineFacade.AddLine(lineEntity);
if (result != 0)
{
if (flag == true)
{
MessageBox.Show("下机成功", "温馨提示");
flag = false;
}
}
else
{
MessageBox.Show("下机失败", "温馨提示");
}
}
}
}
}
对于这段代码
if (flag == true)
{
MessageBox.Show("下机成功", "温馨提示");
flag = false;
}
为了限制MessageBox出现次数,定义了一个记录状态的值,类似于单例模式。