这次的项目需要使用Winform来实现,我们使用的是CSkin的皮肤。文章主要记录使用过程中遇到的小问题,也是楼主网上查找很久才找到的,这里总结下。

插件地址:

使用SKinDataGridView出现列乱排序问题

下面这张图是我在使用SKinDataGridView的界面,可以发现这个操作列没有在最后面,可是我在集合中分明是按照顺序来添加的,排序方式都一样的。

查找资料发现这个数据控件有点问题,最好不要让其自动的排序,除非是自己的查找列和展示的列名一致,这样才会正常显示,要是不一样就会像上面图片一样显示。(我这个就是因为ID和状态栏隐藏了,所以顺序就打乱了。)

下面这张图是我集合中的添加顺序

其实之前我一直在调整SortMode,这个上面显示是排序的顺序,但是一直出错。

经过多方查找终于找到了原因,其实就是之前上面说的哪样,栏目中又些隐藏了。那么我们就关闭其排序,不让其自动进行排序。代码如下:

            //关掉列排序
skinGuidData.AutoGenerateColumns = false;
skinGuidData.DataSource = plService.GetPackagelistsByState();

F12到后台发现:其实是不让其自动排序。

这样就完美的解决了上面的问题。

时间控件SKinDataTimePicker显示右边时间图标

这个问题其实完全可以避免,但是我们在画页面的时候把里面的文本框的内容设置的太大了,导致此控件本身的时间图标不能正常显示。效果如下图所示:

下面这个是运行界面的效果,很是难受呀。导致我检查了很久才发现问题的所在。

原因:是因为我们把字体的font设置的太大了,导致把图标遮住了。所以才会出现上图的界面;

我们把这个设置未9pt就OK了。<还是要细心呀>

窗体的几个常见操作

做技术一定要认真,一点小的失误都不允许。

窗体固定显示到正中央:

StartPosition:CenterScreen

不让其窗体放大放小:

FormBorderStyle :F开头的都可以

取消最大化,最小化:

MaximumBox:False

MinimizeBox:false

关于方法中可空类型的处理

是这样的,service方法中又很多参数是可空类型的,但是我们从前台接收到的是各种不能为空的类型。

之前的做法:没一次进行判断,不是可空的传递进去就OK。

service方法:

        /// <summary>
/// 通过日期,单位,快递公司进行分类查询
/// </summary>
/// <returns></returns>
public IList<Packagelist> GetPackagelistByDateOrCompanyOrStoreAddress(DateTime? startDate,DateTime? endDate,CourierCompany? courierCompany,StoreAddress? storeAddress)
{
var query = this.CrudPackagelist().Table().Where(x=>x.State==false); //从未取走的包裹中查找
if (startDate.HasValue || endDate.HasValue) // 或:一真为真
{
if (startDate.HasValue)
{
query = query.Where(x => x.CreateDate >startDate);
}
if (endDate.HasValue)
{
endDate = DateTime.Parse(endDate.Value.AddDays(1).ToString("yyyy-MM-dd 00:00:00"));
query = query.Where(x => x.CreateDate <=endDate); //这是查找某一特定时间的,这个还需要变化。
}
}
if (courierCompany.HasValue)
{
query = query.Where(x => x.CourierCompany == courierCompany);
}
if (storeAddress.HasValue)
{
query = query.Where(x => x.StoreAddress == storeAddress);
}
return query.OrderByDescending(x => x.CreateDate).ToList();
}

调用方法:

       /// <summary>
///未取包裹查询
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void skinButton2_Click(object sender, EventArgs e)
{
DateTime? startDate = null;
DateTime? endDate = null;
StoreAddress? storeAddressValue = null;
CourierCompany? courierCompanyValue = null;
try
{
if (!string.IsNullOrWhiteSpace(skinDate_UnclaimedStart.text))
{
startDate = DateTime.Parse(skinDate_UnclaimedStart.text);
}
if (!string.IsNullOrWhiteSpace(skinDate_UnclaimedEnd.text))
{
endDate = DateTime.Parse(skinDate_UnclaimedEnd.text);
}
if (skinStoreAddress.SelectedIndex != 0)
{
storeAddressValue = (StoreAddress)Enum.Parse(typeof(StoreAddress), ((ListItem)(skinStoreAddress.SelectedItem)).Text);
}
if (skinCourierCompany.SelectedIndex != 0)
{
courierCompanyValue = (CourierCompany)Enum.Parse(typeof(CourierCompany), ((ListItem)(skinCourierCompany.SelectedItem)).Text);
}
var resultList = plService.GetPackagelistByDateOrCompanyOrStoreAddress(startDate, endDate, courierCompanyValue, storeAddressValue);
skinNotTakeGuidData.DataSource = resultList;
}
catch (Exception ex)
{
Common.MsgBoxInfo("操作失败"+ex.Message);
}
}

一次封装,流程简化的过程

其实上面的代码都把一部分说明了,下面在说一下具体的场景,想从下面的下拉框中选择特定的值,传递后台进行选择查询。但是后台的方法参数是可空的,但是这里可空的转变有问题,不会像bs一样,很直接干脆。

关于枚举转换未下拉列表(SKinComboxBox)的操作:

            Type courierCompany = typeof(CourierCompany);
this.skinCourierCompany.Items.Insert(0, "----请选择----");
foreach (int index in Enum.GetValues(courierCompany))
{
string name = Enum.GetName(courierCompany, index);
string value = index.ToString();
ListItem item = new ListItem();
item.Text = name;
item.Value = value;
this.skinCourierCompany.Items.Add(item);
}
this.skinCourierCompany.SelectedIndex = 0;
this.Show();

这里让下拉框第一个显示的是请选择,让直接插入第一个

后台的方法:

courierCompanyValue = (CourierCompany)Enum.Parse(typeof(CourierCompany), ((ListItem)(skinCourierCompany.SelectedItem)).Text);

这样就取到了选中的值,类型是枚举类型,但是要是选择请选择的话,这里的转换就会有错误。表示将可空类型转换不过去,报错误。

我们思路是先那取到的序号进行判断,要是是第一个那个就不进行转换,直接传递Null值就OK,不是就直接传递。下面是我之前的做法:

        /// <summary>
/// 查询事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void skinBtn_Accept_Click(object sender, EventArgs e)
{
//测试
StoreAddress storeAddressValue;
CourierCompany courierCompanyValue;
if (skinStoreAddress.SelectedIndex != 0 && skinCourierCompany.SelectedIndex != 0) //与:一假为假
{
storeAddressValue =(StoreAddress)Enum.Parse(typeof(StoreAddress), ((ListItem)(skinStoreAddress.SelectedItem)).Text);
courierCompanyValue =(CourierCompany)Enum.Parse(typeof(CourierCompany), ((ListItem)(skinCourierCompany.SelectedItem)).Text);
resultList = plService.GetPackagelistByDateOrCompanyOrStoreAddress(startDate, endDate, courierCompanyValue,storeAddressValue);
skinGuidData.DataSource = resultList;
return;
}if(skinCourierCompany.SelectedIndex !=0)
{
courierCompanyValue = (CourierCompany)Enum.Parse(typeof(CourierCompany), ((ListItem)(skinCourierCompany.SelectedItem)).Text);
}
if (skinStoreAddress.SelectedIndex != 0)
{
storeAddressValue = (StoreAddress)Enum.Parse(typeof(StoreAddress), ((ListItem)(skinStoreAddress.SelectedItem)).Text);
}
if (skinStoreAddress.SelectedIndex == 0 && skinCourierCompany.SelectedIndex != 0)
{
courierCompanyValue =
(CourierCompany)
Enum.Parse(typeof(CourierCompany), ((ListItem)(skinCourierCompany.SelectedItem)).Text);
resultList = plService.GetPackagelistByDateOrCompanyOrStoreAddress(startDate, endDate, courierCompanyValue,
null);
skinGuidData.DataSource = resultList;
return;
}
if (skinCourierCompany.SelectedIndex == 0 && skinStoreAddress.SelectedIndex != 0)
{
storeAddressValue = (StoreAddress)Enum.Parse(typeof(StoreAddress), ((ListItem)(skinStoreAddress.SelectedItem)).Text);
resultList = plService.GetPackagelistByDateOrCompanyOrStoreAddress(startDate, endDate,
null, storeAddressValue);
skinGuidData.DataSource = resultList;
return;
}
if (skinStoreAddress.SelectedIndex == 0 || skinCourierCompany.SelectedIndex == 0) //或:一真为真
{
resultList = plService.GetPackagelistByDateOrCompanyOrStoreAddress(startDate, endDate, null, null);
skinGuidData.DataSource = resultList;
return;
}
}

从之前的代码可以看到很多地方被复用了,没有一点高效代码的意思,在老大的帮助下,知道传递的可以是null值,那么我开始创建类型就赋值未null,要是没有变化就修改,要是有变化就直接传递变量,这样本来他就是Null,就不需要修改了。下面是修改后的代码:

        /// <summary>
///未取包裹查询
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void skinButton2_Click(object sender, EventArgs e)
{
DateTime? startDate = null;
DateTime? endDate = null;
StoreAddress? storeAddressValue = null;
CourierCompany? courierCompanyValue = null;
try
{
if (!string.IsNullOrWhiteSpace(skinDate_UnclaimedStart.text))
{
startDate = DateTime.Parse(skinDate_UnclaimedStart.text);
}
if (!string.IsNullOrWhiteSpace(skinDate_UnclaimedEnd.text))
{
endDate = DateTime.Parse(skinDate_UnclaimedEnd.text);
}
if (skinStoreAddress.SelectedIndex != 0)
{
storeAddressValue = (StoreAddress)Enum.Parse(typeof(StoreAddress), ((ListItem)(skinStoreAddress.SelectedItem)).Text);
}
if (skinCourierCompany.SelectedIndex != 0)
{
courierCompanyValue = (CourierCompany)Enum.Parse(typeof(CourierCompany), ((ListItem)(skinCourierCompany.SelectedItem)).Text);
}
var resultList = plService.GetPackagelistByDateOrCompanyOrStoreAddress(startDate, endDate, courierCompanyValue, storeAddressValue);
skinNotTakeGuidData.DataSource = resultList;
}
catch (Exception ex)
{
Common.MsgBoxInfo("操作失败"+ex.Message);
}
}

是不是简单多了,就不需要我之前那样一直进行判断了。

要理解编码是一个多思考,多动手的工作。

WinForm操作隐藏的小知识点的更多相关文章

  1. 刚接触Linux,菜鸟必备的小知识点(一)

    身为一个将要大四的学生,而且还是学计算机的没有接触过linux简直是羞愧难当.这个假期做了一个软件测试员,必须要熟悉linux的操作,所以对于我这个菜鸟我也就说几点比较重要的小知识点吧. 第一.cd指 ...

  2. 【转】HTML5的小知识点小集合

    html5的小知识点小集合 html5知识   1.  Doctype作用?标准模式与兼容模式各有什么区别? (1).<!DOCTYPE>声明位于位于HTML文档中的第一行,处于<h ...

  3. html5的小知识点小集合

      html5的小知识点小集合 html5知识   1.  Doctype作用?标准模式与兼容模式各有什么区别? (1).<!DOCTYPE>声明位于位于HTML文档中的第一行,处于< ...

  4. android 小知识点

    小知识点总结 1. android中MotionEvent.ACTION_CANCEL事件如何被触发? 对于这个问题,android文档的说明很简短,想看明白很难.国外一网页说的还比较详细,写在这里分 ...

  5. jQuery 小知识点(插件)

    1.jQuery插件小知识点: 估计很多人都没弄明白下面的东西,特从网络上搜索了下面的知识,自己以后用起来也比较方便: $.fn是指jquery的命名空间,加上fn上的方法及属性,会对jquery实例 ...

  6. python中的小知识点

    这里是一些小知识点的汇集,为的是以后查找的方便. 行与缩进: 物理行:实际看到的代码行数. 逻辑行:在意义上的函数(即解释器执行的行数) 如果一个物理行中包含了多个逻辑行,则每个逻辑行之间需要用分号 ...

  7. C#、Java中的一些小知识点总结(持续更新......)

    前言:在项目中,有时候一些小的知识,总是容易让人忽略,但是这些功能加在项目中往往十分的有用,因此笔者在这里总结项目中遇到的一些实用的小知识点,以备用,并持续更新...... 1.禁用DataGridV ...

  8. 你所不了解的javascript操作DOM的细节知识点(一)

    你所不了解的javascript操作DOM的细节知识点(一) 一:Node类型 DOM1级定义了一个Node接口,该接口是由DOM中的所有节点类型实现.每个节点都有一个nodeType属性,用于表明节 ...

  9. React之小知识点总结

    总结react中常常被忽略的小知识点 1)即使state里设置成和之前的值一样,render也会重新渲染 2)父组件传给子组件的属性(props是只读的,在子组件中已在this.state里将属性赋值 ...

随机推荐

  1. [内核笔记1]内核文件结构与缓存——inode和对应描述

    由来:公司内部外网记录日志的方式现在都是通过Nginx模块收到数据发送到系统消息队列,然后由另外一个进程来从消息队列读取然后写回磁盘这样的操作,尽量的减少Nginx的阻塞. 但是由于System/V消 ...

  2. Mybatis批量删除

    <delete id="deleteByStandardIds"> delete from t_standard_catalog where standard_id i ...

  3. 【夯实Nginx基础】Nginx工作原理和优化、漏洞

    本文地址 原文地址 本文提纲: 1.  Nginx的模块与工作原理    2.  Nginx的进程模型    3 . NginxFastCGI运行原理        3.1 什么是 FastCGI   ...

  4. Dynamics CRM 之ADFS 使用 WID 的独立联合服务器

    ADFS 的使用 WID 的独立联合服务器适用于自己的测试环境,常用的就是在虚机中使用. 拓扑图如下: wID:联合身份验证服务配置为使用 Windows 内部数据库

  5. VS2015 Git 源码管理工具简单入门

    1.VS Git插件 1.1 环境 VS2015+GitLab 1.2 Git操作过程图解 1.3 常见名词解释 拉取(Pull):将远程版本库合并到本地版本库,相当于(Fetch+Meger) 获取 ...

  6. 【教程】SQLite数据库修复

    SQLite 大家都知道,就不多说了. 有时候数据量大了,或者存储过程中出现异常,数据库就可能会出问题. 这是以前公司产品出现过的问题,导致软件都打不开了,我花了不少时间才解决的,趁现在有空贡献出来. ...

  7. UGUI Text(Label)

    环境 Unity 5.3.6f1 关于Best Fit 如果勾选了 Best Fit ,当有大量的文本填充在Text上时,那么文字是不会自动换行的. 打字机效果 在github上已有现成的:https ...

  8. .NET开源进行时:消除误解、努力前行(本文首发于《程序员》2015第10A期的原始版本)

    2014年11月12日,ASP.NET之父.微软云计算与企业级产品工程部执行副总裁Scott Guthrie,在Connect全球开发者在线会议上宣布,微软将开源全部.NET核心运行时,并将.NET ...

  9. Hadoop学习笔记—22.Hadoop2.x环境搭建与配置

    自从2015年花了2个多月时间把Hadoop1.x的学习教程学习了一遍,对Hadoop这个神奇的小象有了一个初步的了解,还对每次学习的内容进行了总结,也形成了我的一个博文系列<Hadoop学习笔 ...

  10. 《AngularJS深度剖析与最佳实践》简介

    由于年末将至,前阵子一直忙于工作的事务,不得已暂停了微信订阅号的更新,我将会在后续的时间里尽快的继续为大家推送更多的博文.毕竟一个人的力量微薄,精力有限,希望大家能理解,仍然能一如既往的关注和支持sh ...