WinForm操作隐藏的小知识点

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

插件地址:

使用SKinDataGridView出现列乱排序问题

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

image

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

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

image

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

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

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

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

image

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

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

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

image

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

image

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

image

我们把这个设置未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);
            }           
        }

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

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

转载于:https://www.cnblogs.com/netxiaohui/p/6141103.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目名称:[精仿]360手机助手-14.2.6更新(CSkin Demo) 界面库版本号:14.2.6 最新版本 下载内容: 精仿360手机助手源码一份, 可引用至工具箱最新版CSkin.dll一份 实现功能: 1.发光标题。 2.直角边框和阴影。 3.360手机助手主界面模仿。 4.多系统支持,不需要win8系统,即可实现win8风格的360手机助手。 5.自定义控件的美化使用。 界面库更新文档: CC2014-2.6 1.修复拖动好友出现的负值BUG和拖动后有机率会消失的问题。 2.好友列表DoubleClickSubItem事件添加回调参数MouseEventArgs,用于判断鼠标操作的一些参数,如:左键双击还是右键双击判断。 3.对SkinDataGridView属性进行部分重构,颜色美化属性增加。 4.窗体加入绘制模式边框颜色属性BorderColor和InnerBorderColor 5.解决SkinTabControl left和right绘制模式下tab标签悬浮样式不变化问题。 6.所有控件采用最高质量模式绘制文字,防止字体模糊以及锯齿。 CC2013-12.8 1.优化SkinTabControl的效率,不再呢么闪烁,360DEMO直接替换DLL,改部分属性小错误,就可以看到明显闪烁减少效果。 2.为SkinStrip分类的控件添加 是否统一变换字体颜色的属性。 3.为SkinAnimatorImg动画图片框控件添加Stretch属性,是否拉伸模式绘制动画。 4.修复SkinComboBox无法DataSource绑定项的BUG。 5.增加音乐播放器,萝莉人物窗体,等DEMO。 6.修复部分细节bug。 提示:窗体继承SkinMain,再设置下SkinBack,有你想不到的惊喜哦,此窗体是用于绘制异形窗体专用,你给他什么图片,窗体就会按照图片来绘制。有一个缺点就是,有透明像素的背景区域,控件不给于显示。 CC2013-10.30 1.由于SkinForm名字太多人使用,界面库命名正式改为CSkin.dll,官网www.cskin.net。 2.SkinTabControl标签中添加菜单箭头,可点击展开菜单。 3.SkinTabControl添加标签关闭按钮。 4.修复部分中文乱码问题。 5.优化好友列表右键菜单。 6.将窗体自定义系统按钮改为集合模式,可添加无数个自定义系统按钮。自定义系统按钮事件中可以 e.参数 来判断。 7.增加360安全卫士-DEMO案例。 8.增加SkinAnimatorImg控件,用于支持位图动画的播放。如360的动态logo。 9.各种细节BUG优化。 CC2013-10.11 1.添加SkinTabControlEx,加入更加自定义的美化属性和动画效果。 2.添加SkinAnimator,通用动画控件。 3.添加Html编辑器控件 4.修复SkinButton图标和文本相对位置的BUG CC2013-9.26 1.优化好友列表CPU占用 2.好友列表加入好友登录平台属性:安卓 苹果 WEBQQ PC 3.优化标题绘制模式,新添标题绘制模式属性。 4.新添标题偏移度属性。 5.加入圆形进度条控件:ProgressIndicator。 CC2013-9.5.2 1.优化截图控件,截图工具栏加入新功能。 2.解决个人信息卡和天气窗体显示后不会消失的问题。 3.各种细节BUG优化。 CC2013-9.5.1 1.解决贴边左右隐藏的BUG。 2.解决窗体点击事件不能触发的问题。 3.优化SkinButton继承父容器背景色的代码。 4.解决SkinButton异常错误。 CC2013-9.3 1.好友列表右键菜单没反应问题。 2.新增美化控件SkinDatagridview。 3.密码软件盘回删不了文字问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值