C#WinForm利用DataGridView創作高級查詢窗體

         創作前,我們先整理一下思路。簡單點來說,高級查詢關鍵就是:

select * from 表名 where 字段=’***’ and字段>’***’ or字段<’***’ and字段 like ‘%***%’ or字段<>’***’……where後面的字符串的拼接。

假如,有辦法獲取到where後面的字符,那麼高級查詢就可以做到了。下面就來利用DataGridView創作高級查詢。

第一步,先創建一個窗體FrmSelect.cs,然後修改一些屬性:

                1、  StartPosition屬性值修改爲CenterScreen,將窗體顯示作固定。

                2、  ControlBox屬性值修改爲False,將窗體的關閉等按鈕作隱藏。

第二步,添加DataGridView,然後修改一些屬性:

                1、  RowHeaderVisible屬性修改爲False,將DataGridView最左邊的空白處作隱藏。

                2、  EditModel屬性修改爲EditOnEnter,將DataGridView的雙擊編輯改爲單擊編輯。

                3、  添加4列固定列:項目、條件、邏輯的ColumnType都選擇爲:

         DataGridViewComboBoXExColumn,賦值的ColumnType選擇爲:TextBox的。

效果如下圖:

wKioL1RUabTz0ftvAAKkRbc1ys8338.jpg

 

    下面來實現,當點擊確定時,獲取拼接好的字符串,並關閉查詢窗體:

    

一、查詢窗體代碼:

        #region 定義
        public DataTable dt;//用於,接收傳入的數據
        public string sql = "";//用於,保存查詢條件生成的字符串
        #endregion
        #region 取消
        private void tsClose_Click(object sender, EventArgs e)
        {
            this.Close();//關閉查詢窗體
        }
        #endregion
        #region 確定
        private void tsSave_Click(object sender, EventArgs e)
        {
            string ite = "", ope = "", val = "", log = ""; sql = "";
            this.dgv.EndEdit();//結束DataGridView的編輯狀態。這句非常重要,若沒有這句則無法獲取正在編輯的值。
            for (int i = 0; i < dgv.Rows.Count - 1; i++)
            {
                if (dgv.Rows[i].Cells[0].Value != null && dgv.Rows[i].Cells[1].Value != null && dgv.Rows[i].Cells[2].Value != null && dgv.Rows[i].Cells[3].Value != null)
                {
                    ite = dgv.Rows[i].Cells[0].Value.ToString().Trim();//項目
                    ope = dgv.Rows[i].Cells[1].Value.ToString().Trim();//條件
                    val = dgv.Rows[i].Cells[2].Value.ToString().Trim();//賦值
                    log = dgv.Rows[i].Cells[3].Value.ToString().Trim();//邏輯
                    //字符串拼接
                    if (ite != "" && ope == "相同" && val != "" && log != "")
                    {
                        sql += log + " " + ite + "='" + val + "' ";
                    }
                    if (ite != "" && ope == "大於" && val != "" && log != "")
                    {
                        sql += log + " " + ite + ">'" + val + "' ";
                    }
                    if (ite != "" && ope == "小於" && val != "" && log != "")
                    {
                        sql += log + " " + ite + "<'" + val + "' ";
                    }
                    if (ite != "" && ope == "包含" && val != "" && log != "")
                    {
                        sql += log + " " + ite + " like '%" + val + "%' ";
                    }
                    if (ite != "" && ope == "除外" && val != "" && log != "")
                    {
                        sql += log + " " + ite + "<>'" + val + "' ";
                    }
                }
            }
            this.Close();//關閉查詢窗體
        }
        #endregion
        #region 重置
        private void tsWaiver_Click(object sender, EventArgs e)
        {
            //重置DataGridView
            dgv.Rows.Clear();
            sql = "";
        }
        #endregion
        #region 當窗體加載完畢時,執行
        private void FrmSelect_Load(object sender, EventArgs e)
        {
            SetSelectItems();//設置高級查詢條件的選項
        }
        #endregion
        #region 設置高級查詢條件的選項
        /// <summary>
        /// 設置高級查詢條件的選項
        /// </summary>
        private void SetSelectItems()
        {
            //根據傳入的DataTable,獲取列名,並添加到“項目”
            this.Column1.Items.Clear();
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                this.Column1.Items.Add(dt.Columns[i].ColumnName);
            }
            //添加條件
            this.Column2.Items.Clear();
            this.Column2.Items.Add("包含");
            this.Column2.Items.Add("相同");            
            this.Column2.Items.Add("大於");
            this.Column2.Items.Add("小於");
            this.Column2.Items.Add("除外");
            //添加邏輯
            this.Column4.Items.Clear();
            this.Column4.Items.Add("And");
            this.Column4.Items.Add("Or");
        }
        #endregion

 

二、作爲主窗體,先點擊高級查詢按鈕,打開查詢窗體。主窗體代碼:

        #region 高級查詢
        private void tsSelect_Click(object sender, EventArgs e)
        {
            FrmSelect frmSelect = new FrmSelect();
            frmSelect.dt = sql_Base._GetAllTable("STOCK");//傳入DataTable數據            
            frmSelect.ShowDialog();
            string sql = frmSelect.sql;//返回的高級查詢字符串。
            frmSelect.Dispose();
        }
        #endregion

      綜上,利用DataGridView自身能夠自動添加行特點,達到一種動態添加的效果。並且可成功獲得的sql字符串拼接,有了where後面的sql字符串拼接,你想怎麼查就怎麼查。所以高級查詢窗體創作是成功的。

    效果圖1:wKioL1RavsuyMjmXAABvFU2vc08436.jpg

    效果圖2:wKioL1RavwiDKLeGAAB4pdCA3oc644.jpg

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章