FineUI 官方论坛

标题: 【经验分享】当数据为空时的一个错误 [打印本页]

作者: 石头oswica    时间: 2015-10-24 08:11
标题: 【经验分享】当数据为空时的一个错误
如果绑定数据为空,会导致一个错误。
位置:
pagebase.CS
方法:GetSelectedDataKeyID

修改后的代码:

  1.         protected int GetSelectedDataKeyID(Grid grid)
  2.         {
  3.             int id = -1;
  4.             if (grid.Rows.Count>0)
  5.             {
  6.                 int rowIndex = grid.SelectedRowIndex;
  7.                 if (rowIndex >= 0)
  8.                 {
  9.                     id = Convert.ToInt32(grid.DataKeys[rowIndex][0]);
  10.                 }
  11.             }
  12.             return id;
  13.         }

  14.         protected string GetSelectedDataKey(Grid grid, int dataIndex)
  15.         {
  16.             string data = String.Empty;
  17.             if (grid.Rows.Count > 0)
  18.             {
  19.                 int rowIndex = grid.SelectedRowIndex;
  20.                 if (rowIndex >= 0)
  21.                 {
  22.                     data = grid.DataKeys[rowIndex][dataIndex].ToString();
  23.                 }
  24.             }
  25.             return data;
  26.         }
复制代码



作者: sanshi    时间: 2015-10-26 21:54
请详细说明,怎么个错误法?
作者: huxingz    时间: 2015-10-28 16:08
哈哈,正好我也发现了这个问题.
并且已经修改好了.
作者: huxingz    时间: 2015-10-28 16:12
sanshi 发表于 2015-10-26 21:54
请详细说明,怎么个错误法?

这个是主要发生在某类数据不存在,然后又要和其他数据进行关联的时候.
比如说:职称用户管理,部门用户管理,角色用户管理,角色权限管理

并且引发错误的代码都在这些页面后台程序的 BindGrid2 里面
原来的代码如下:
  1. int deptID = GetSelectedDataKeyID(Grid1);

  2.                 if (deptID == -1)
  3.                 {
  4.                     Grid2.RecordCount = 0;

  5.                     Grid2.DataSource = null;
  6.                     Grid2.DataBind();
  7.                 }
  8.                 else
  9.                 {
  10.                     // 查询 X_User 表
  11.                     IQueryable<User> q = DB.Users.Include(u => u.Dept);

  12.                     // 在用户名称中搜索
  13.                     string searchText = ttbSearchUser.Text.Trim();
  14.                     if (!String.IsNullOrEmpty(searchText))
  15.                     {
  16.                         q.Where(u => u.Name.Contains(searchText));
  17.                     }

  18.                     q = q.Where(u => u.Name != "admin");

  19.                     // 过滤选中部门下的所有用户
  20.                     q = q.Where(u => u.Dept.ID == deptID);

  21.                     // 在查询添加之后,排序和分页之前获取总记录数
  22.                     Grid2.RecordCount = q.Count();

  23.                     // 排列和分页
  24.                     q = SortAndPage<User>(q, Grid2);

  25.                     Grid2.DataSource = q;
  26.                     Grid2.DataBind();
  27.                 }
复制代码


修改后的代码是这样:

  1. //不存在部门信息的情况下, 不继续后面的操作
  2.             if (Grid1.Rows.Count == 0)
  3.             {
  4.                 return;
  5.             }
  6.             else
  7.             {
  8.                 int deptID = GetSelectedDataKeyID(Grid1);

  9.                 if (deptID == -1)
  10.                 {
  11.                     Grid2.RecordCount = 0;

  12.                     Grid2.DataSource = null;
  13.                     Grid2.DataBind();
  14.                 }
  15.                 else
  16.                 {
  17.                     // 查询 X_User 表
  18.                     IQueryable<User> q = DB.Users.Include(u => u.Dept);

  19.                     // 在用户名称中搜索
  20.                     string searchText = ttbSearchUser.Text.Trim();
  21.                     if (!String.IsNullOrEmpty(searchText))
  22.                     {
  23.                         q.Where(u => u.Name.Contains(searchText));
  24.                     }

  25.                     q = q.Where(u => u.Name != "admin");

  26.                     // 过滤选中部门下的所有用户
  27.                     q = q.Where(u => u.Dept.ID == deptID);

  28.                     // 在查询添加之后,排序和分页之前获取总记录数
  29.                     Grid2.RecordCount = q.Count();

  30.                     // 排列和分页
  31.                     q = SortAndPage<User>(q, Grid2);

  32.                     Grid2.DataSource = q;
  33.                     Grid2.DataBind();
  34.                 }
  35.             }
复制代码


其他几个都这样改
作者: huxingz    时间: 2015-10-28 16:15
主要是在进行操作之前,先加一个判断.
避免引发这类错误.
因为操作是基于必须有数据的基础上.
作者: 石头oswica    时间: 2015-11-10 16:52
你不能保证一定有数据哈。

作者: 石头oswica    时间: 2015-11-10 16:53
huxingz 发表于 2015-10-28 16:12
这个是主要发生在某类数据不存在,然后又要和其他数据进行关联的时候.
比如说:职称用户管理,部门用户管理, ...

你这个改的太辛苦了。我给的方案只要改一个地方哈。




欢迎光临 FineUI 官方论坛 (https://www.fineui.com/bbs/) Powered by Discuz! X3.4