• 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);
                }           
            }

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

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

  • 相关阅读:
    模板jinja2常用方法
    简单实用的日志类CLog (Python版)
    Databus架构分析与初步实践
    AWS API 2.0签名规范
    django学习——通过get_FOO_display 查找模型中的choice值
    Twitter如何在数千台服务器上快速部署代码?
    mysql 添加索引 mysql 如何创建索引
    sql中的like和正则的区别
    python2.7运行出现的Warning: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode
    Python命令模块argparse学习笔记(四)
  • 原文地址:https://www.cnblogs.com/netxiaohui/p/6141103.html
Copyright © 2020-2023  润新知