代碼生成工具之Winform查詢列表界面生成


在上面一篇隨筆《代碼生成工具之界面快速生成》介紹了代碼生成工具Database2Sharp的界面生成操作,其中介紹了Web界面(包括列表界面、內容顯示、內容編輯界面的生成,另外還介紹了Winform界面的內容編輯界面的生成,本篇主要繼續介紹Winform界面生成中的查詢列表界面的操作展示等信息。

基於Winform的界面生成,配合我的Winform開發框架,提供了三種不同的界面生成,包括傳統界面樣式、DotNetBar界面樣式和DevExpress界面樣式的代碼生成,這幾種界面是目前Winform開發中非常常見的界面樣式。

1、EnterpriseLibray架構代碼及Web界面生成

基於EnterpriseLibray架構的代碼生成,除了可以生成傳統的業務層、數據訪問層、數據訪問接口層、實體層外,還同時生成了Web界面工程,Web界面工程已經添加了相關的引用程序集及必須的控件,生成后即可編譯運行,一些表字段設計合理的話,甚至不用修改一行代碼就能直接使用,如下所示。

生成的Web界面截圖如下所示,包含列表查詢界面、內容顯示界面、內容編輯界面等。

 

內容編輯界面(新增和編輯)如下所示。

2、Winform界面生成

1)Winform數據編輯界面生成

在上面一篇隨筆《代碼生成工具之界面快速生成》同時也介紹了Winform界面的生成,上一篇主要介紹了Winform界面中的數據編輯界面。

Winform界面生成界面提供了很多參數進行控制,以期生成精細化的界面內容。

 

DevExpress界面樣式的生成。

傳統樣式的界面生成。

2)Winform查詢列表界面生成

很多情況下,查詢列表界面很常見,如果能快速生成標准的界面,除了可以節省時間,提高開發效率外,也給我們統一界面風格及代碼風格等方面,提供更好的支持。

復雜累贅的界面能夠自動生成,絕對是開發過程的一大提升,讓我們更加享受開發的樂趣。

 1)設置好相關的界面參數,如指定列表的查詢字段、列表顯示字段,選擇界面樣式,以及設定代碼的主命名空間等參數。

2)生成界面代碼到文件后,把文件直接復制到項目中,不用修改直接就可以看到列表界面效果,Yeah,正是我們需要的樣式。

當然,上面的查詢條件可以一行,也可以兩行或者多行,界面生成的時候,會自動合理計算好布局,保證完美展現我們想要的列表界面效果。以上界面幾乎不用任何修改就直接可以編譯運行,里面的后台代碼也同時生成了。

后台代碼里面生成包括,分頁控件展示及列表查詢顯示、Excel數據導入、數據導出等功能的后台界面代碼。以下就是完整生成的界面后台代碼,沒有編輯過的列表界面后台代碼如下所示。

    public partial class FrmItemDetail : BaseDock
    {
        public FrmItemDetail2()
        {
            InitializeComponent();

            InitDictItem();

            this.winGridViewPager1.OnPageChanged += new EventHandler(winGridViewPager1_OnPageChanged);
            this.winGridViewPager1.OnStartExport += new EventHandler(winGridViewPager1_OnStartExport);
            this.winGridViewPager1.OnEditSelected += new EventHandler(winGridViewPager1_OnEditSelected);
            this.winGridViewPager1.OnAddNew += new EventHandler(winGridViewPager1_OnAddNew);
            this.winGridViewPager1.OnDeleteSelected += new EventHandler(winGridViewPager1_OnDeleteSelected);
            this.winGridViewPager1.OnRefresh += new EventHandler(winGridViewPager1_OnRefresh);
            this.winGridViewPager1.AppendedMenu = this.contextMenuStrip1;
            this.winGridViewPager1.ShowLineNumber = true;

            this.txtItemNo.KeyUp += new System.Windows.Forms.KeyEventHandler(this.SearchControl_KeyUp);
            this.txtItemName.KeyUp += new System.Windows.Forms.KeyEventHandler(this.SearchControl_KeyUp);
            this.txtManufacture.KeyUp += new System.Windows.Forms.KeyEventHandler(this.SearchControl_KeyUp);
            this.txtMapNo.KeyUp += new System.Windows.Forms.KeyEventHandler(this.SearchControl_KeyUp);
            this.txtSpecification.KeyUp += new System.Windows.Forms.KeyEventHandler(this.SearchControl_KeyUp);
            this.txtMaterial.KeyUp += new System.Windows.Forms.KeyEventHandler(this.SearchControl_KeyUp);
            this.txtItemBigType.KeyUp += new System.Windows.Forms.KeyEventHandler(this.SearchControl_KeyUp);
            this.txtItemType.KeyUp += new System.Windows.Forms.KeyEventHandler(this.SearchControl_KeyUp);
            this.txtUnit.KeyUp += new System.Windows.Forms.KeyEventHandler(this.SearchControl_KeyUp);
            this.txtSource.KeyUp += new System.Windows.Forms.KeyEventHandler(this.SearchControl_KeyUp);
            
        }

        /// <summary>
        /// 編寫初始化窗體的實現,可以用於刷新
        /// </summary>
        public override void  FormOnLoad()
        {   
            BindData();
        }
        
        /// <summary>
        /// 初始化字典列表內容
        /// </summary>
        private void InitDictItem()
        {
            //初始化代碼
        }
        
        /// <summary>
        /// 分頁控件刷新操作
        /// </summary>
        private void winGridViewPager1_OnRefresh(object sender, EventArgs e)
        {
            BindData();
        }
        
        /// <summary>
        /// 分頁控件刪除操作
        /// </summary>
        private void winGridViewPager1_OnDeleteSelected(object sender, EventArgs e)
        {
            if (MessageDxUtil.ShowYesNoAndTips("您確定刪除選定的記錄么?") == DialogResult.No)
            {
                return;
            }

            int[] rowSelected = this.winGridViewPager1.GridView1.GetSelectedRows();
            foreach (int iRow in rowSelected)
            {
                string ID = this.winGridViewPager1.GridView1.GetRowCellDisplayText(iRow, "ID");
                BLLFactory<ItemDetail>.Instance.Delete(ID);
            }
             
            BindData();
        }
        
        /// <summary>
        /// 分頁控件編輯項操作
        /// </summary>
        private void winGridViewPager1_OnEditSelected(object sender, EventArgs e)
        {
            string ID = this.winGridViewPager1.gridView1.GetFocusedRowCellDisplayText("ID");
            List<string> IDList = new List<string>();
            for (int i = 0; i < this.winGridViewPager1.gridView1.RowCount; i++)
            {
                string strTemp = this.winGridViewPager1.GridView1.GetRowCellDisplayText(i, "ID");
                IDList.Add(strTemp);
            }

            if (!string.IsNullOrEmpty(ID))
            {
                FrmEditItemDetail dlg = new FrmEditItemDetail();
                dlg.ID = ID;
                dlg.IDList = IDList;
                if (DialogResult.OK == dlg.ShowDialog())
                {
                    BindData();
                }
            }
        }
        
        /// <summary>
        /// 分頁控件新增操作
        /// </summary>        
        private void winGridViewPager1_OnAddNew(object sender, EventArgs e)
        {
            btnAddNew_Click(null, null);
        }
        
        /// <summary>
        /// 分頁控件全部導出操作前的操作
        /// </summary> 
        private void winGridViewPager1_OnStartExport(object sender, EventArgs e)
        {
            string where = GetConditionSql();
            this.winGridViewPager1.AllToExport = BLLFactory<ItemDetail>.Instance.FindToDataTable(where);
         }

        /// <summary>
        /// 分頁控件翻頁的操作
        /// </summary> 
        private void winGridViewPager1_OnPageChanged(object sender, EventArgs e)
        {
            BindData();
        }
        
        /// <summary>
        /// 根據查詢條件構造查詢語句
        /// </summary> 
        private string GetConditionSql()
        {
            SearchCondition condition = new SearchCondition();
            condition.AddCondition("ItemNo", this.txtItemNo.Text, SqlOperator.Like);
            condition.AddCondition("ItemName", this.txtItemName.Text, SqlOperator.Like);
            condition.AddCondition("Manufacture", this.txtManufacture.Text, SqlOperator.Like);
            condition.AddCondition("MapNo", this.txtMapNo.Text, SqlOperator.Like);
            condition.AddCondition("Specification", this.txtSpecification.Text, SqlOperator.Like);
            condition.AddCondition("Material", this.txtMaterial.Text, SqlOperator.Like);
            condition.AddCondition("ItemBigType", this.txtItemBigType.Text, SqlOperator.Like);
            condition.AddCondition("ItemType", this.txtItemType.Text, SqlOperator.Like);
            condition.AddCondition("Unit", this.txtUnit.Text, SqlOperator.Like);
            condition.AddCondition("Source", this.txtSource.Text, SqlOperator.Like);
            
            string where = condition.BuildConditionSql(DatabaseType.SqlServer).Replace("Where", "");

            return where;
        }
        
        /// <summary>
        /// 綁定列表數據
        /// </summary>
        private void BindData()
        {
            this.winGridViewPager1.DisplayColumns = "ItemNo,ItemName,Manufacture,MapNo,Specification,Material,ItemBigType,ItemType,Unit,Price,Source,StoragePos,UsagePos,Note,WareHouse,Dept";
            #region 添加別名解析

            this.winGridViewPager1.AddColumnAlias("ItemNo", "備件編號");
            this.winGridViewPager1.AddColumnAlias("ItemName", "備件名稱");
            this.winGridViewPager1.AddColumnAlias("Manufacture", "供貨商");
            this.winGridViewPager1.AddColumnAlias("MapNo", "圖號");
            this.winGridViewPager1.AddColumnAlias("Specification", "規格型號");
            this.winGridViewPager1.AddColumnAlias("Material", "材質");
            this.winGridViewPager1.AddColumnAlias("ItemBigType", "備件屬類");
            this.winGridViewPager1.AddColumnAlias("ItemType", "備件類別");
            this.winGridViewPager1.AddColumnAlias("Unit", "單位");
            this.winGridViewPager1.AddColumnAlias("Price", "單價");
            this.winGridViewPager1.AddColumnAlias("Source", "來源");
            this.winGridViewPager1.AddColumnAlias("StoragePos", "庫位");
            this.winGridViewPager1.AddColumnAlias("UsagePos", "使用位置");
            this.winGridViewPager1.AddColumnAlias("Note", "備注");
            this.winGridViewPager1.AddColumnAlias("WareHouse", "所屬庫房");
            this.winGridViewPager1.AddColumnAlias("Dept", "所屬部門");

            #endregion

            string where = GetConditionSql();
            List<ItemDetailInfo> list = BLLFactory<ItemDetail>.Instance.FindWithPager(where, this.winGridViewPager1.PagerInfo);
            this.winGridViewPager1.DataSource = new WHC.Pager.WinControl.SortableBindingList<ItemDetailInfo>(list);
            this.winGridViewPager1.PrintTitle = Portal.gc.gAppUnit + " -- " + "信息報表";
         }
        
        /// <summary>
        /// 查詢數據操作
        /// </summary>
        private void btnSearch_Click(object sender, EventArgs e)
        {
            BindData();
        }
        
        /// <summary>
        /// 新增數據操作
        /// </summary>
        private void btnAddNew_Click(object sender, EventArgs e)
        {
            FrmEditItemDetail dlg = new FrmEditItemDetail();
            if (DialogResult.OK == dlg.ShowDialog())
            {
                BindData();
            }
        }
        
        /// <summary>
        /// 提供給控件回車執行查詢的操作
        /// </summary>
        private void SearchControl_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                btnSearch_Click(null, null);
            }
        }        


        private string moduleName = "備件信息";
        /// <summary>
        /// 導入Excel的操作
        /// </summary>          
        private void btnImport_Click(object sender, EventArgs e)
        {
            string templateFile = string.Format("{0}-模板.xls", moduleName);
            FrmImportExcelData dlg = new FrmImportExcelData();
            dlg.SetTemplate(templateFile, System.IO.Path.Combine(Application.StartupPath, templateFile));
            dlg.OnDataSave += new FrmImportExcelData.SaveDataHandler(ExcelData_OnDataSave);
            dlg.OnRefreshData += new EventHandler(ExcelData_OnRefreshData);
            dlg.ShowDialog();
        }

        void ExcelData_OnRefreshData(object sender, EventArgs e)
        {
            BindData();
        }
        
        bool ExcelData_OnDataSave(DataRow dr)
        {
            bool success = false;
            ItemDetailInfo info = new ItemDetailInfo();
             info.ItemNo = dr["備件編號"].ToString();
             info.ItemName = dr["備件名稱"].ToString();
             info.Manufacture = dr["供貨商"].ToString();
             info.MapNo = dr["圖號"].ToString();
             info.Specification = dr["規格型號"].ToString();
             info.Material = dr["材質"].ToString();
             info.ItemBigType = dr["備件屬類"].ToString();
             info.ItemType = dr["備件類別"].ToString();
             info.Unit = dr["單位"].ToString();
             info.Price = Convert.ToDecimal(dr["單價"].ToString());
             info.Source = dr["來源"].ToString();
             info.StoragePos = dr["庫位"].ToString();
             info.UsagePos = dr["使用位置"].ToString();
             info.Note = dr["備注"].ToString();
             info.WareHouse = dr["所屬庫房"].ToString();
             info.Dept = dr["所屬部門"].ToString();
 
            success = BLLFactory<ItemDetail>.Instance.Insert(info);
             return success;
        }

        /// <summary>
        /// 導出Excel的操作
        /// </summary>
        private void btnExport_Click(object sender, EventArgs e)
        {
            string file = FileDialogHelper.SaveExcel(string.Format("{0}.xls", moduleName));
            if (!string.IsNullOrEmpty(file))
            {
                List<ItemDetailInfo> list = BLLFactory<ItemDetail>.Instance.GetAll();
                 DataTable dtNew = DataTableHelper.CreateTable("序號|int");
                DataRow dr;
                int j = 1;
                for (int i = 0; i < list.Count; i++)
                {
                    dr = dtNew.NewRow();
                    dr["序號"] = j++;
                     dr["備件編號"] = list[i].ItemNo;
                     dr["備件名稱"] = list[i].ItemName;
                     dr["供貨商"] = list[i].Manufacture;
                     dr["圖號"] = list[i].MapNo;
                     dr["規格型號"] = list[i].Specification;
                     dr["材質"] = list[i].Material;
                     dr["備件屬類"] = list[i].ItemBigType;
                     dr["備件類別"] = list[i].ItemType;
                     dr["單位"] = list[i].Unit;
                     dr["單價"] = list[i].Price;
                     dr["來源"] = list[i].Source;
                     dr["庫位"] = list[i].StoragePos;
                     dr["使用位置"] = list[i].UsagePos;
                     dr["備注"] = list[i].Note;
                     dr["所屬庫房"] = list[i].WareHouse;
                     dr["所屬部門"] = list[i].Dept;
                     dtNew.Rows.Add(dr);
                }

                try
                {
                    string error = "";
                    AsposeExcelTools.DataTableToExcel2(dtNew, file, out error);
                    if (!string.IsNullOrEmpty(error))
                    {
                        MessageDxUtil.ShowError(string.Format("導出Excel出現錯誤:{0}", error));
                    }
                    else
                    {
                        if (MessageDxUtil.ShowYesNoAndTips("導出成功,是否打開文件?") == System.Windows.Forms.DialogResult.Yes)
                        {
                            System.Diagnostics.Process.Start(file);
                        }
                    }
                }
                catch (Exception ex)
                {
                    LogHelper.Error(ex);
                    MessageDxUtil.ShowError(ex.Message);
                }
            }
         }
    }

傳統界面效果生成操作,只需要選擇傳統界面樣式,生成即可,得到的初始化界面如下所示。

如果是只是指定了幾個查詢條件(一行的情況),那么工具會自動計算好布局位置,得到界面效果如下所示。

代碼生成工具Database2Sharp還提供了生成基於DotNetbar的樣式的查詢列表界面代碼,和上圖類似,在此不再贅述。

通過代碼生成工具,不僅可以生成整體性的EnterpriseLibary框架結構代碼,連我們繁瑣的Web界面、Winform界面都能快速、高標准生成,開發界面其實是一件很輕松快速的事情,不要整天從數據庫字段和界面屬性設置中來回切換了。有了Database2Sharp代碼生成工具,一切變得寧靜很多,但更加快速。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM