加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SqlServer中计算列详解和winform中改变DataGridView中符合条件的

发布时间:2020-12-12 13:20:39 所属栏目:MsSql教程 来源:网络整理
导读:一、目标: ? 增加“行政处罚下达时间”,“送法院时间”改为“距送法院天数”(?“距送法院天数”为当前时间减去“行政处罚下达时间“,随着时间改变,自动改变),如果“距送法院天数”在 3 个月内,字体为黄色,超过 3 个月,字体为红色。 二、方法: a.S

一、目标:?

增加“行政处罚下达时间”,“送法院时间”改为“距送法院天数”(?“距送法院天数”为当前时间减去“行政处罚下达时间“,随着时间改变,自动改变),如果“距送法院天数”在3个月内,字体为黄色,超过3个月,字体为红色。


二、方法:

a.SqlServer中使用计算列

b.winform中改变DataGridView中符合条件的字体的颜色和列的颜色。


三、行动:

a.SqlServer中计算列详解

1.谷歌答案

计算列区别于需要我们手动或者程序给予赋值的列,它的值来源于该表中其它列的计算值。比如,一个表中包含有数量列Number与单价列Price,我们就可以创建计算列金额Amount来表示数量*单价的结果值,创建Amount列后,在程序中需要使用计算金额这个值时,就不用取出Number列与Price列的值后相乘,而是直接取Amount列的值就可以了。


那么这个计算列要如何建立呢?
先看通过sql的方法创建:
create?table?table1
(
number?decimal(18,4),
price?money,
Amount?as?number*price?--这里就是计算列
)
计算列是不需要我们指定数据类型与是否允许为null等信息的,SqlServer会根据情况自动赋予数据类型。

在microsoft?sql?server?management?studio建创计算列更是简单。如下图所示,只要在列属性中的"计算所得的列规范"-"公式"中填写计算列的公式就可以了。


在上面的图片中我们也看到有"是持久的"这个选项,这个选项有什么用呢?
计算列如果没有特殊的设定,它将会是一个虚拟列,也就是这个列实际上是不存在的,只是每次要取这列的值时,sql会按照计算列的公式计算一次,再把结果返回给我们。这样就会存在一些问题,比如,每次计算都会消耗一定的时间,而且也不能在这个列上创建索引。那么能不能把计算列的结果存起来,每次取数据的时候直接把结果返回给我们,而不用每次去计算。呵呵,恭喜你,创建计算列时把"是持久的"这个选项勾起来,就能达到我们的目的了,这时候,计算列就是一个实实在在的列,也可以在该列上创建索引了。
如果要查看所有已经存在计算列以及该计算列是否为"是持久的",可以利用 sys.computed_columns 视图

注意:
1,计算列如果没有设置为"是持久的",那么它是不可以用来做check,foreign?key或not?null约束。当然,如果我们在microsoft?sql?server?management?studio为计算列设置了check等约束了,sql?server会自动将该列设置为"是持久的"。
2,计算列不可以再次用来作为中一个计算列的一部分。
3,在触发器,不可以对计算列进行update判断,否则会报如下错误:
列''不能在IF?UPDATE子句中使用,因为它是计算列


2.个人答案



b.winform中改变DataGridView中符合条件的字体的颜色和列的颜色。

1.谷歌答案

只需要使用DataGridView的CellPainting事件。代码如下:

[c-sharp]? view plain copy
  1. private?void?dgvUsers_CellPainting(object?sender,?DataGridViewCellPaintingEventArgs?e)??
  2. ???????{??
  3. ???????????if?(e.RowIndex?<?0)??
  4. ???????????????return;??
  5. ??
  6. ???????????DataGridViewRow?dgr?=?dgvUsers.Rows[e.RowIndex];??
  7. try??
  8. ???????????{??
  9. ???????????????if?(e.ColumnIndex?==?3)//定位到第3列,如不定位到具体的哪列,则整行的颜色改变??
  10. ???????????????{??
  11. ???????????????????if?(dgr.Cells["Column4"].Value.ToString()?==?"停用")//dgr.Cells["Column4"]为需要判断的列Name,而不是HeadText??
  12. ???????????????????{??
  13. ???????????????????????e.CellStyle.ForeColor?=?Color.Red;//将前景色设置为红色,即字体颜色设置为红色??
  14. ???????????????????????e.CellStyle.BackColor?=?Color.Green;//将背景色设置为绿色,即列的颜色设置为红色??
  15. ???????????????????}??
  16. ???????????????}??
  17. ???????????}??
  18. catch??
  19. ???????????{???
  20. ?????????????????
  21. ???????}??
??

?

效果图:

?

效果图

2.个人答案

  private void dataGridView2_CellPainting(object sender,DataGridViewCellPaintingEventArgs e)
        {
            if (e.RowIndex < 0)
                return;

            DataGridViewRow dgr = dataGridView2.Rows[e.RowIndex];
            try
            {
                if (e.ColumnIndex == 25)//定位到第3列,如不定位到具体的哪列,则整行的颜色改变  
                {

                    if (Convert.ToInt32( dgr.Cells["SFYSJ"].Value) > 90)//dgr.Cells["Column4"]为需要判断的列Name,而不是HeadText  
                    {
                        e.CellStyle.ForeColor = Color.Red;//将前景色设置为红色,即字体颜色设置为红色  
                        //e.CellStyle.BackColor = Color.Green;//将背景色设置为绿色,即列的颜色设置为红色  
                    }
                    else if (Convert.ToInt32(dgr.Cells["SFYSJ"].Value) < 90)
                    {
                        e.CellStyle.ForeColor = Color.Yellow;
                    }
                }
            }
            catch
            {

            }  
        }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读