编写winform 自定义控件,控件具备输入搜索条件的功能同时具备显示搜索结果的功能,显示用的是DataGridView控件,搜索用的TextBox位于DataGridView控件的第一行的每一列下面,即每一列的第一行都是搜索栏
时间: 2024-02-01 15:14:58 浏览: 77
好的,以下是一个简单的实现步骤:
1. 创建一个自定义控件,并在其中添加一个 DataGridView 控件。
2. 在 DataGridView 控件的 ColumnHeaderMouseClick 事件中,为每一列的第一行添加一个 TextBox 控件,用于输入搜索条件。
3. 在 TextBox 控件的 TextChanged 事件中,获取输入的搜索条件并更新 DataGridView 控件中的数据,可以通过 DataTable 或 BindingSource 来实现。
4. 如果需要支持多列搜索,可以在 TextBox 控件的 KeyDown 事件中监听 Enter 键,当用户按下 Enter 键时,根据当前列的索引找到下一个要搜索的列,并将焦点移动到该列的 TextBox 控件中。
以下是一个简单的代码示例:
```csharp
public partial class SearchableDataGridView : UserControl
{
private DataGridView dataGridView;
private Dictionary<int, TextBox> searchTextBoxes;
public SearchableDataGridView()
{
InitializeComponent();
this.dataGridView = new DataGridView();
this.dataGridView.Dock = DockStyle.Fill;
this.Controls.Add(this.dataGridView);
this.dataGridView.ColumnHeaderMouseClick += DataGridView_ColumnHeaderMouseClick;
this.searchTextBoxes = new Dictionary<int, TextBox>();
}
private void DataGridView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
if (e.Button == MouseButtons.Left && e.RowIndex == -1)
{
var textBox = new TextBox();
textBox.Dock = DockStyle.Fill;
var headerCell = this.dataGridView.Columns[e.ColumnIndex].HeaderCell;
headerCell.Style.BackColor = Color.LightGray;
headerCell.Style.SelectionBackColor = Color.LightGray;
this.dataGridView.Controls.Add(textBox);
this.searchTextBoxes[e.ColumnIndex] = textBox;
textBox.TextChanged += TextBox_TextChanged;
textBox.KeyDown += TextBox_KeyDown;
textBox.Focus();
}
}
private void TextBox_TextChanged(object sender, EventArgs e)
{
var dataTable = (DataTable)this.dataGridView.DataSource;
var bindingSource = (BindingSource)this.dataGridView.DataSource;
if (dataTable != null)
{
var filter = string.Join(" OR ", this.searchTextBoxes
.Where(pair => !string.IsNullOrWhiteSpace(pair.Value.Text))
.Select(pair => $"{pair.Key} LIKE '%{pair.Value.Text}%'"));
dataTable.DefaultView.RowFilter = filter;
}
else if (bindingSource != null)
{
var filter = string.Join(" OR ", this.searchTextBoxes
.Where(pair => !string.IsNullOrWhiteSpace(pair.Value.Text))
.Select(pair => $"{pair.Key} LIKE '%{pair.Value.Text}%'"));
bindingSource.Filter = filter;
}
}
private void TextBox_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
var currentColumn = this.dataGridView.CurrentCell.ColumnIndex;
var nextColumn = (currentColumn + 1) % this.dataGridView.ColumnCount;
this.dataGridView.CurrentCell = this.dataGridView.Rows[0].Cells[nextColumn];
this.searchTextBoxes[nextColumn].Focus();
}
}
}
```
注意,在使用 DataTable 时,需要先设置 DataGridView 的 DataSource 属性,然后再将 DataTable 设置为 DataSource 的值。而在使用 BindingSource 时,则可以直接将 BindingSource 设置为 DataSource 的值。
阅读全文