程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> WinForm操作隱藏的小知識點,winform隱藏知識點

WinForm操作隱藏的小知識點,winform隱藏知識點

編輯:關於.NET

WinForm操作隱藏的小知識點,winform隱藏知識點


這次的項目需要使用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);
            }           
        }

是不是簡單多了,就不需要我之前那樣一直進行判斷了。

     要理解編碼是一個多思考,多動手的工作。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved