需求是这样,只有调整日期,调整金额两列能被修改,其余的列都不能被修改。日期格式要防止用户输错。数字输入了中文也要提示。
数据来源于存储过程里的视图,这里需要注意的一点是:datagridview采用adaptor绑定的数据,如果比如调整金额字段是数据类型的字段,那么在datagridview上这个字段下面输入文字,即使try catch或者 tryparse都会根本不进断点就报错了,我的做法是把这些日期,数字字段在视图上 用convert转为nvarchar类型的数据类型,这样改了之后就能自由的处理日期格式,数字转换错误了。
 
1、批量更新
我是这样做的,创建一个修改数据的类:clsUpdateRow,里面有id ,data1,data2 3个数据,id记录表的主键,data1作为调整日期......为datagridview做CellValueChanged事件,事件里面首先判断是否是能被修改的列。每次修改了就把clsUpdateRow放入list集合中,点击保存就循环这个集合。对于只读列,就用dgv_update.Columns[i].ReadOnly = true; 可修改列 改为 false就可以了。

 private void dgv_update_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
var dgv = sender as DataGridView; string id = dgv["id", e.RowIndex].Value.ToString(); clsUpdateRow cls = listupdates.Find(l => l.id == id); if (cls == null)
{
cls = new clsUpdateRow();
} cls.id = id;
var d1 = ValidateCol(dgv["调整日期", e.RowIndex].Value);
var d2 = ValidateCol(dgv["调整金额", e.RowIndex].Value);
if (d1 != "")
{
DateTime dd = DateTime.Now; if (!DateTime.TryParse(d1, out dd))
{
MessageBox.Show("日期输入不正确");
return;
}
}
if (d2 != "")
{ double ddd = 0.0;
if (!double.TryParse(d2, out ddd))
{
MessageBox.Show("请输入有效数字");
return;
}
} cls.data1 = d1;
cls.data2 = d2; listupdates.Add(cls);
}

private void btn_save_Click(object sender, EventArgs e)
{
if (listupdates.Count < 1)
{
MessageBox.Show("没有要更改的数据");
return;
}
string sql = "update [uj_Funding_plan_auto] set tzdate={0},tzmoney={1} where id={2}"; List<SqlParameter> listps = new List<SqlParameter>(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < listupdates.Count; i++)
{
var item = listupdates[i];
string tzdate = "@tzdate" + i;
string tzmoney = "@tzmoney" + i;
string id = "@id" + i; sb.Append(string.Format(sql, tzdate, tzmoney, id) + "\r\n"); SqlParameter p1 = new SqlParameter();
p1.ParameterName = tzdate; if (item.data1.Trim() == "")
{
p1.Value = DBNull.Value;
}
else
{
p1.Value = item.data1;
} SqlParameter p2 = new SqlParameter();
p2.ParameterName = tzmoney; if (item.data2.Trim() == "")
{
p2.Value = DBNull.Value;
}
else
{
p2.Value = item.data2;
}
listps.Add(new SqlParameter(id, listupdates[i].id)); listps.Add(p1);
listps.Add(p2);
} SqlHelper.ExecuteNonQuery(SqlHelper.ConnectionString, sb.ToString(), listps.ToArray());
listupdates.Clear(); btn_query.PerformClick();
}
2.日期设置 、指定列弹出右键菜单
在这个基础之上,我发现这个如果本来不填日期的,填了日期,想要清楚就无法做到了。我就加了一个右键菜单,专门用来清楚日期,而且这个也只能在日期这一列才能弹出菜单。具体的做法是这样的。
首先,控制菜单再指定列弹出。不要再datagridview里的控件属性里的ContextMenuStrip设置这个菜单,因为如果再这里设置了菜单的话,你不管点击哪一列,都会弹出这个菜单的。弹出的代码:
private void dgv_update_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
if (e.ColumnIndex != dgv_update.Columns["调整日期"].Index)
{
return;
}
if (e.Button == MouseButtons.Right)
{
row = e.RowIndex;
col = e.ColumnIndex;
dgv_menu.Show(MousePosition.X, MousePosition.Y);
}
}
这里记录的row和col值,是在点击了清楚日期事件后找到这个单元格需要的。
dgv_update[col,row].Value = "";
 
 

files.cnblogs.com/files/HelloQLQ/测试dgv更新.zip

datagridview 批量更新、日期设置、指定列弹出右键菜单的更多相关文章

  1. 如何在 QWidget 窗口上弹出右键菜单

    Title : QWidget 窗口上弹出右键菜单的两个方法 Solution 1 : 给一个 QWidget 添加 QActions,设置 QWidget 的 contextMenuPolicy 属 ...

  2. WPF datagrid 弹出右键菜单时先选中该项

    private void datagrid_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)    {        ...

  3. Android中实现长按照片弹出右键菜单

    场景 效果 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 将布局改为Lin ...

  4. 在WPF中弹出右键菜单时判断鼠标是否选中该项

      和上篇在WPF的TreeView中实现右键选定一样,这仍然是一个右键菜单的问题: 这个需求是在一个实现剪贴板的功能的时候遇到的:在弹出右键菜单时,如果菜单弹出位置在ListViewItem中时,我 ...

  5. update批量更新某一列成其它列对应的值【原】

    update批量更新某一列成其它列对应的值 postgresql 标准sql语句 update AA set name = BB.name , AA.sex = BB.sex from BB wher ...

  6. ListView的使用(二)长按弹出上下文菜单

    public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView ...

  7. EditorGUILayout.EnumPopup 枚举弹出选择菜单

    http://www.unity蛮牛.com/thread-25490-1-1.html http://www.unity蛮牛.com/m/Script/EditorGUILayout.EnumPop ...

  8. 转:jQuery弹出二级菜单

    <html> <head> <meta http-equiv="content-type" content="text/html; char ...

  9. WPF:设置弹出子菜单的是否可用状态及效果

    需求: 设置弹出子菜单(二级)项仅首项可用,其他项均不可用:不可用是呈灰色效果. 注: 菜单项都是依据层级数据模板.具体格式如下: StackBlock{TextBlock{Image}.TextBl ...

  10. 微信小程序弹出操作菜单

    微信小程序弹出操作菜单 比如在页面上放一个按钮,点击按钮弹出操作菜单,那么在按钮的 bindtap 事件里,执行下面的代码即可: wx.showActionSheet({ itemList: ['A' ...

随机推荐

  1. Qt Create开发,修改 .Pro 文件改变 exe 的名称

    // .pro // 修改 TARGET 就可以改变生成的exe的名称 TARGET = Test // 要是生成的exe名称中需要带有空格,需要用到$$quote TARGET = $$quote( ...

  2. Scrapy 基础入门

    0x01 框架概述 Scrapy 是基于 Python 的一个非常流行的网络爬虫框架,可以用来抓取 Web 站点并从页面中提取结构化的数据 (1)核心组件 引擎:用来控制整个系统的数据处理流程 调度器 ...

  3. 如何用vsftpd实现用户不同权限:只能下载,可上传,管理权限等 [仅供参考未亲测]

    如何用vsftpd实现用户不同权限:只能下载,可上传,管理权限等  2007-01-29 10:20:09 分类: LINUX 前提条件:       必须安装包:vsftpd-2.0.1-5     ...

  4. spring cloud 学习笔记 服务注册与发现(二)

    前言 服务注册与发现的学习.这个其实是微服务的核心了,因为微服务的一个重要理念就是将项目拆分,达到解耦的地步.那么如何把这些服务联系到一起就很关键. 如果一个服务到另外一个服务通过ip地址之间访问,虽 ...

  5. NodeJs初探索

    练习1:模块之间的引用 a.js // 引入b.js模块 var b = require("./b"); // 调用对象里的方法: 对象.属性名 对象.方法名() b.add(); ...

  6. 力扣1113(MySQL)-报告的记录(简单)

    题目: 动作表:Actions 此表没有主键,所以可能会有重复的行. action 字段是 ENUM 类型的,包含:('view', 'like', 'reaction', 'comment', 'r ...

  7. sql中的order by 按列排序

    在视频网课的时候,看到老师讲ORDER BY 后面跟了多个列,按列位置排序: SELECT `大类名`,`进价`,`售价` FROM `商品表` ORDER BY `大类名`,`售价` DESC; 这 ...

  8. HarmonyOS NEXT应用开发之深色模式适配

    介绍 本示例介绍在开发应用以适应深色模式时,对于深色和浅色模式的适配方案,采取了多种策略如下: 固定属性适配:对于部分组件的颜色属性,如背景色或字体颜色,若保持不变,可直接设定固定色值或引用固定的资源 ...

  9. 3 种发布策略,解决 K8s 中快速交付应用的难题

    作者 | 郝树伟(流生)阿里云高级研发工程师 前言 软件技术更新换代很快,但我们追求的目标是一直不变的,那就是在安全稳定的前提下,增加应用的部署频率,缩短产品功能的迭代周期,这样的好处就是企业可以在更 ...

  10. 当新零售遇上 Serverless

    ​简介: Serverless 的出现给传统企业数字化转型带了更多机遇. 某零售商超行业的龙头企业,其主要业务涵盖购物中心.大卖场.综合超市.标准超市.精品超市.便利店及无人值守智慧商店等零售业态,涉 ...