formsortfilter.cs

来自「csharp课本的源代码」· CS 代码 · 共 239 行

CS
239
字号
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace SortAndFilter
{
    public partial class FormSortFilter : Form
    {
        public FormSortFilter()
        {
            InitializeComponent();
        }
        //窗体的Load事件
        private void FormSortFilter_Load(object sender, EventArgs e)
        {
            //将原始数据源数据填充到强类型DataSet的表中
            myTable2TableAdapter.Fill(myDatabaseDataSet.MyTable2);
            //填充列名
            FillFieldToComboBox(ref comboBoxSortFileld);
            //添加条件表达式左边的可选项
            comboBoxFilterFileld.Items.AddRange(new object[] { "姓名", "成绩" });
            //添加逻辑运算符
            comboBoxOperator.Items.AddRange(new object[] { ">", "<", "=" });
        }
        /// <summary>
        /// 将MyTable2的列名填充到指定的ComboBox对象中
        /// </summary>
        /// <param name="combobox">要填充的ComboBox对象</param>
        private void FillFieldToComboBox(ref ComboBox combobox)
        {
            combobox.Items.Clear();
            for (int i = 0; i < myDatabaseDataSet.MyTable2.Columns.Count; i++)
            {
                combobox.Items.Add(myDatabaseDataSet.MyTable2.Columns[i].ColumnName);
            }
        }
        /// <summary>
        /// 在只读的文本框中显示生成的排序字符串
        /// </summary>
        private void ShowSortString()
        {
            textBoxSortString.Text = "";
            for (int i = 0; i < listBoxSort.Items.Count; i++)
            {
                string item = listBoxSort.Items[i].ToString().Replace("(升序)", " ASC");
                item = item.Replace("(降序)", " DESC");
                textBoxSortString.Text += ", " + item;
            }
            if (textBoxSortString.Text.Length > 0)
            {
                //移除字符串左边的逗号和空格
                textBoxSortString.Text = textBoxSortString.Text.Remove(0, 2);
            }
        }
        /// <summary>
        /// 将指定的ListBox中的当前选项上移一行
        /// </summary>
        /// <param name="listbox"></param>
        private void MoveUp(ref ListBox listbox)
        {
            int index = listbox.SelectedIndex;
            if (index > 0)
            {
                object item = listbox.Items[index];
                listbox.Items[index] = listbox.Items[index - 1];
                listbox.Items[index - 1] = item;
                listbox.SelectedIndex = index - 1;
            }
        }
        /// <summary>
        /// 将指定的ListBox中的当前选项下移一行
        /// </summary>
        /// <param name="listbox"></param>
        private void MoveDown(ref ListBox listbox)
        {
            int index = listbox.SelectedIndex;
            if (index < listbox.Items.Count - 1)
            {
                object item = listbox.Items[index];
                listbox.Items[index] = listbox.Items[index + 1];
                listbox.Items[index + 1] = item;
                listbox.SelectedIndex = index + 1;
            }
        }
        //单击排序中的添加按钮触发的事件 
        private void buttonAddSort_Click(object sender, EventArgs e)
        {
            if (comboBoxSortFileld.SelectedIndex == -1)
            {
                MessageBox.Show("请先选择要排序的列",
                    "", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
            }
            else
            {
                string item1 = comboBoxSortFileld.SelectedItem.ToString() + "(升序)";
                string item2 = comboBoxSortFileld.SelectedItem.ToString() + "(降序)";
                if (listBoxSort.Items.Contains(item1) == false &&
                     listBoxSort.Items.Contains(item2) == false)
                {
                    string sortTypeString = (radioButtonAsc.Checked ? "(升序)" : "(降序)");
                    listBoxSort.Items.Add(comboBoxSortFileld.SelectedItem.ToString() +
                        sortTypeString);
                    ShowSortString();
                }
                else
                {
                    MessageBox.Show("排序项中已包含该列");
                }
            }
        }
        //单击排序中的移除按钮触发的事件
        private void buttonRemoveSort_Click(object sender, EventArgs e)
        {
            if (listBoxSort.SelectedIndex != -1)
            {
                //由于没有相同的项,所以可以使用Remove方法
                listBoxSort.Items.Remove(listBoxSort.SelectedItem);
                ShowSortString();
            }
        }
        //单击排序字段中的上移按钮触发的事件
        private void buttonSortMoveUp_Click(object sender, EventArgs e)
        {
            MoveUp(ref listBoxSort);
            ShowSortString();
        }
        //单击排序字段中的下移按钮触发的事件
        private void buttonSortMoveDown_Click(object sender, EventArgs e)
        {
            MoveDown(ref listBoxSort);
            ShowSortString();
        }
        //单击更新排序条件按钮触发的事件
        private void buttonSetSort_Click(object sender, EventArgs e)
        {
            if (textBoxSortString.Text.Length > 0)
            {
                myTable2BindingSource.Sort = textBoxSortString.Text;
            }
        }
        /// <summary>
        /// 在只读的文本框中显示过滤条件表达式
        /// </summary>
        private void ShowFilterExpression()
        {
            string filterString = "";
            for (int i = 0; i < listBoxFilter.Items.Count; i++)
            {
                filterString += " " + listBoxFilter.Items[i].ToString();
            }
            textBoxFilterString.Text = filterString;
        }
        //单击添加条件按钮触发的事件
        private void buttonAddFilter_Click(object sender, EventArgs e)
        {
            if (comboBoxFilterFileld.SelectedIndex == -1
                || comboBoxOperator.SelectedIndex == -1
                || textBoxConstant.Text.Length == 0)
            {
                MessageBox.Show("条件表达式格式不正确,不能添加");
            }
            else
            {
                string constantText = textBoxConstant.Text;
                //如果包含单引号,则移除之
                constantText = constantText.Replace("'", "");
                if (comboBoxFilterFileld.SelectedItem.ToString() == "姓名")
                {
                    constantText = "'" + constantText + "'";
                }
                else
                {
                    //判断逻辑表达式右边是否为数字
                    try
                    {
                        int i = Convert.ToInt32(constantText);
                    }
                    catch
                    {
                        MessageBox.Show("成绩只能与数字比较", "格式错误");
                        return;
                    }
                }
                listBoxFilter.Items.Add(comboBoxFilterFileld.SelectedItem.ToString() +
                    comboBoxOperator.SelectedItem.ToString() + constantText);
                ShowFilterExpression();
            }
        }

        //单击添加连接符按钮触发的事件
        private void buttonAddLogicOperator_Click(object sender, EventArgs e)
        {
            listBoxFilter.Items.Add(radioButtonAnd.Checked ? "AND" : "OR");
            ShowFilterExpression();
        }

        //单击移除条件按钮触发的事件
        private void buttonRemoveFilter_Click(object sender, EventArgs e)
        {
            if (listBoxFilter.SelectedIndex != -1)
            {
                //由于可能有相同的项,所以只能使用RemoveAt方法,不能用Remove方法
                listBoxFilter.Items.RemoveAt(listBoxFilter.SelectedIndex);
                ShowFilterExpression();
            }
        }

        //单击条件中的上移按钮触发的事件
        private void buttonFilterMoveUp_Click(object sender, EventArgs e)
        {
            MoveUp(ref listBoxFilter);
            ShowFilterExpression();
        }

        //单击条件中的下移按钮触发的事件
        private void buttonFilterMoveDown_Click(object sender, EventArgs e)
        {
            MoveDown(ref listBoxFilter);
            ShowFilterExpression();
        }
        //单击更新过滤条件按钮触发的事件
        private void buttonSetFilter_Click(object sender, EventArgs e)
        {
            try
            {
                myTable2BindingSource.Filter = textBoxFilterString.Text;
            }
            catch (Exception err)
            {
                MessageBox.Show(err.Message, "失败");
            }
        }
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?