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 + -
显示快捷键?