DataGridView ——管理员对用户的那点操作

记得第一次做机房收费系统的时候,就在加入删除用户这出现了点小问题,由于一直都是一个容不得一点瑕疵的人。所以对查询用户的时候查询一次就会多一些空行我非常是不能容忍。看似非常小的问题,我却花了非常长的时间。如今机房收费系统重构了。又在这块吹毛求疵了,用了整整两个小时的时间。

攻克了好多好多小问题。

(1)为什么总是显示第一行数据?

用了SqlHelper查询到某一级别的用户返回给U层。就是传统的三层查询思想。当时查询出来后有一点小小的窃喜。可是当加入用户加入的多了,利用DataGridView怎么都是仅仅显示第一行数据。

看看我原来的代码:

        <span style="font-size:14px;">Dim userbll As Bll.UserManager = New Bll.UserManager()
        Dim dt As New DataTable

        dt = userbll.SelectLevelUser(user)   '如今直接调用B层
        DataGridView.AllowUserToAddRows = False   '去掉最后一行的空行,每次查询运行前去掉空行
        '将查询到该级别用户显示到DataGridVIew中
        If dt.Rows.Count > 0 Then
            'DataGridView.Rows(0).Cells("用户ID").Value = dt.Rows(0)("username")
            'DataGridView.Rows(0).Cells("username").Value = dt.Rows(0)("姓名")
            'DataGridView.Rows(0).Cells("开户人").Value = dt.Rows(0)("开户人")
        Else
            '没有查到内容时
            DataGridView.Rows.Clear()
            MsgBox("没有查到记录!")
        End If</span>

这两当dt.Rows.Count > 0 之后说明查询到用户记录,可是无论查到多少条记录。当datatable返回一个查到的用户表给U层之后,接下来的代码就是显示的第一行的记录。所以就是在这里犯了错误。

看到有些人的博客就是这样写的。可能是由于一開始加入的记录都比較少吧。

每次DataTable返回来的数据都是查询到的一个表,而仅仅是把DataTable的第一行的某个自己主动赋给前面DataGridView的一个列,当数据仅仅有一行的时候这固然没有错,可是数据行数多了就会出现错误。

这是由于没有一个循环或者嵌套把每一行的数据都加入到DataGridView中。

解决方式:利用循环嵌套语句,把返回来的datatable表这个的数据分别赋值给DataGridView表。

       <span style="font-size:14px;">       If dt.Rows.Count > 0 Then
            'DataGridView.Rows(0).Cells("用户ID").Value = dt.Rows(1)("username")
            'DataGridView.Rows(0).Cells("username").Value = dt.Rows(1)("姓名")
            'DataGridView.Rows(0).Cells("开户人").Value = dt.Rows(1)("开户人")
            '查到内容显示
            For i = 0 To dt.Rows.Count - 1
                DataGridView.Rows.Add()  '一開始没有行和列,所以要加入一行和一列,避免错误发生
                For j = 0 To dt.Columns.Count - 1
                    DataGridView(j, i).Value = dt.Rows(i).Item(j)
                Next j
                'DataGridView.AllowUserToAddRows = False    '假设放在这里,还是会有最后一行
            Next i
        Else
            DataGridView.Rows.Clear()
            MsgBox("没有查到记录!")
        End If</span>

当然,还有个非常easy的方法,就是直接绑定数据源:

DatagridView.DataSource=dt

凡是复杂的地方都会有简单的方法来解决

(2)为什么没点击一次combo的选项就会多出非常多空行?

基本问题是攻克了,可是当在点击一下combo中的管理员级别时,尽管查到的数据是正确的。可是出现了非常多空行。让人心里不是非常舒服。

这是由于每次查询之前没有把DataGridView中的行都清理掉,也就是一句代码而已:

<span style="font-size:14px;">DataGridView.Rows.Clear()</span>

(3)为什么每次都会显示最后一行为空行呢?

问题一个一个的解决,问题也在一个一个的被发现。

当大面积的空行去掉了,最后另一个小尾巴空行。以我的性格是必须把它去掉的。

这是由于DataGridView控件,使用的都是默认的属性,这最后的空行就是一个默认属性,那么如何去掉它呢?

解决方式:

<span style="font-size:14px;">DataGridView.AllowUserToAddRows = False  </span>

去掉空行以后。当全部问题都解决后:

(4)DatagridView的其它操作

删除选中的行,那删除用户来说,既要删除DataGridView表的行同一时候要删除数据库中的数据。

选中DataGridView的多行然后操作

删除DataGridView的全部行,拿删除用户来说:

<span style="font-size:14px;">If intRows > 0 Then
            For intDelRow = intRows To 1 Step -1            '从下往上删除,防止漏行
                strUserID = DataGridView.SelectedRows(intDelRow - 1).Cells("用户ID").Value.ToString()

                '假设该用户正在工作。则不能删除
                Dim s As String
                s = FrmLogin.txtUserID.Text()

                If FrmLogin.txtUserID.Text = strUserID.Trim() Then
                    'If strUserID.Trim() = FrmLogin.txtUserName.Text Then
                    MsgBox("该用户正在工作。不能删除", vbOKOnly + vbExclamation, "提示")
                    Exit Sub
                Else
                    user.UserID = strUserID                 '将要删除的用户ID传给实体
                    intResult = deletebll.DeleteUser(user)   '同一时候将该实体的信息从数据库中删除
                    'intResult = deletefac.DeleteUser(enUser)
                    If intResult > 0 Then                    '将数据库中所删除的相应的信息在dataGridView表中也删除
                        MsgBox("删除失败", vbOKOnly + vbExclamation, "提示")
                    Else
                        DataGridView.Rows.RemoveAt(DataGridView.SelectedRows(intDelRow - 1).Index)
                        MsgBox("删除成功", vbOKOnly + vbExclamation, "提示")
                    End If
                End If
            Next
        Else
            DataGridView.Rows.Clear()
        End If</span>

(5)DataGridView的其他经常使用操作:

比如:取得当前单元格的行的索引,从0開始

(dataGridView1.CurrentCell.RowIndex).ToString()

行列的隐藏:

// DataGridView1的第一列隐藏
DataGridView1.Columns[0].Visible = false;
// DataGridView1的第一行隐藏
DataGridView1.Rows[0].Visible = false;

这仅仅是我的关于DataGridView眼下操作的理解,还有非常多对DataGridView的经常使用使用方法:

http://blog.sina.com.cn/s/blog_97b9841901011u0u.html

http://www.cnblogs.com/wintalen/archive/2010/12/13/1904536.html

小结:在机房收费系统重构的时候会常常使用到DataGridView控件。所以掌握好一个控件的用法非常重要,它相当于一个承载了我们须要可视给用户的一个篮子。将须要查询的数据显示在这个篮子上。让用户非常清晰的明了信息。而且非常方便的进行对数据的操作。

时间: 2024-10-11 16:17:13

DataGridView ——管理员对用户的那点操作的相关文章

linux用户和组的操作,vi编辑器的使用

用户和组别的操作  Linux系统对用户,组别,被操作的文件有独特的设置 用户与组别对应.组别与被操作的文件对应 后期系统使用过程中管理员root就只需要关心用户属于哪个组别的即可 无需关心用户具体操作什么文件 三种模式:命令(默认).编辑(增删改查).尾行(退出) vi编辑器  1.进入编辑模式    a:光标向后移动一位    i:光标和所在字符不发生变化    o:新起一行    s:删除光标所在字符2.尾行模式的操作    q        //退出编辑器    w        //对

oracle用户与表空间操作

oracle系统用户sys,system , sysman, scott 使用system用户登录[username/password][@server][as sysdba|sysoper]eg: system/123456 @orcl as sysdba 查看当前登录用户:show user 查看数据字典中的用户select username from dba_users; 启用禁用scott账户:alter user scott account unlock;alter user scot

10、自学——Linux的学习进度与任务【用户和用户组相关操作】

用户和用户组相关操作 用户和用户组定义: 用户:资源获取标识符(资源分配),是安全权限模型的可信要素之一 用户组:用户组是指多个用户的集合,方便对一类需要同样权限的用户授权   密码:用户认证  Linux是多用户.多任务的操作系统.  多用户指:多人同时使用系统资源:多任务:同时运行多个进程 用户和用户组的类别: 1.用户:名称解析库 /etc/passwd a.管理员 root 用户标识(UID)为0 b.普通用户及系统用户  普通用户的用户标识(既UID):   CentOS 5,6: 5

ubuntu用户管理与权限操作实例

ubuntu用户管理与权限操作实例 昨天在转载此文时提到都要把文件及目录权限的操作也会独立成文来给大家介绍,今天特地学习了用户管理和权限操作的例程,现总结如下.这些命令基本都是我在自己电脑上运行过后能够实现此功能,我才把他们加进来,希望对大家有所帮助,也希望和大家多交流^_^ 一个实例 例子:假设有两个用户bill和jane,他们都有音乐CD集,并要创建一个共享目录,在该目录下他们各自存储自己的音乐文件.此时用户bill通过sudo获得了超级用户权限. 首先,创建一个以bill和jane为成员的

获取管理员组用户

获取本地管理员组用户 方法一: $strComputer = $env:COMPUTERNAME$computer = [ADSI]("WinNT://" + $strComputer + ",computer")$Group = $computer.psbase.children.find("Administrators")  #可以自定义组名称$members= $Group.psbase.invoke("Members"

ubuntu,从新建一个用户,到转到新建用户的命令行操作

题目链接: http://poj.org/problem?id=2773 Happy 2006 Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 9131   Accepted: 3073 Description Two positive integers are said to be relatively prime to each other if the Great Common Divisor (GCD) is 1.

在Linux下记录所有用户的登录和操作日志

一般我们可以用history命令来查看用户的操作记录,但是这个命令不能记录是哪个用户登录操作的,也不能记录详细的操作时间,且不完整:所以误操作而造成重要的数据丢失,就很难查到是谁操作的. 在这里我们通过脚本代码来实现记录所以用户的登录操作日志: 编辑/etc/profile文件,在文件末尾加入下面代码: 首先加上一行,来记录实时的 export HISTTIMEFORMAT="%F %T `who am i|awk '{print $1}'` as `whoami` : " 实时的有缺

关注公众号的微信用户收到非本人操作的充值消费记录,故障记录

故障描述 关注公众号且没有手机号的微信用户收到非本人操作的充值消费记录 原因分析 访客功能之前,会员的手机号是必输的,因此之前的代码都是在会员手机号不为空的前置条件下开发的,所以没有加对手机号是否为空校验.访客功能上线后,会出现会员手机号为空的情况,造成对之前代码的前置条件造成破坏,又没有对这部分代码进行问题排查,流程中允许了根据空手机号查询微信用户信息,将没有手机号的会员的充值消费通知发给了数据库里不匹配的空手机号的微信用户,形成了上面这个bug. 代码示例 后期todo 1.代码规范前置条件

第40篇 数据库基础知识 管理员 用户登录授权的操作

练习题1: v = dict.fromkeys(['k1','k2'],[]) print(v) v['k1'].append(666) print(v) v['k1'] = 777 print(v) {'k1': [], 'k2': []} {'k1': [666], 'k2': [666]} {'k1': 777, 'k2': [666]} 新式类经典类的区别:经典类: python3 中没有经典类 在python2.7版本中不会主动继承object 继承的查找顺序 深度优先, 没有mro方