C#WinForm利用DataGridView创作高级查询窗体

来源:互联网 发布:mac dns设置多少 编辑:程序博客网 时间:2024/05/29 19:04

         创作前,我们先整理一下思路。简单点来说,高级查询关键就是:

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

本文出自 “9212950” 博客,请务必保留此出处http://9222950.blog.51cto.com/9212950/1570672

阅读全文
0 0
原创粉丝点击