반응형
동적으로 datagridview 를 필터링 하는 방법
퍼왔다 ^^ 대단하다.
http://www.dotneat.net/2008/12/03/DynamicDataGridViewFilteringInC.aspx
In a few lines of code, we can convert a DataGridView control in a powerfull fully searchable control with dynamically generated filters for each column of field the DataGridView is binded to.
How does it work?
- The DataGridControl is binded to the datasource.
- The user hits the button (or shortcut) to start the dynamic filtering feature.
- A new form is dinamycally generated on top of the DatagridView control (it has some transparency on it so you can still see the DataGridView data on the background)
- The form contains several textboxes, one per each column or field the DataGridView datasource contains (you can change that behaviour)
- When the user starts entering text in any of the textboxes, the filter condition is applied to the underlying datasource (for every keystroke) so you can see how the filtered data looks on the DataGridView as you are typing.
- You can, of course define filters for one or more textboxes (fields) at the time, so you can work with multiple filters for many columns/fields.
- You can choose whatever you create a dynamically generated search form that contains all the fields on DataGridView datasource, or the ones of your choice (video and example code shows both cases).
Screenshots
This screenshot shows the dynamically search form generated with all the fields of the underlying DataGridView
This screenshot shows the dynamically search form generated with some of the fields of the underlying DataGridView
Demo Video
Some code:
/// <summary>
/// Build texbox controls for dinamyc search form based on fields collection
/// </summary>
/// <param name="fields"></param>
private void BuildControls(List<field> fields) {
int top = 10;
bool focused = false;
#region Loop for each field
foreach (field f in fields)
{
Label label = new Label();
label.Text = f.FriendlyName + ":";
label.Top = top;
label.Left = 5;
label.AutoSize = true;
this.Controls.Add(label);
TextBox textbox = new TextBox();
textbox.TextChanged += new EventHandler(textBox_TextChanged);
textbox.Tag = f.Field;
textbox.Top = top;
textbox.Left = 68;
textbox.Width = this.Width - 80;
if (!focused) {
textbox.Focus(); //the first control focused
focused = true;
}
top += 35;
this.Controls.Add(textbox);
}
#endregion
this.Height = top + 30;
}
// Raise event to parent form if textbox content changes
private void textBox_TextChanged(object sender, EventArgs e)
{
if (TextChanged != null)
TextChanged(GetFilterValues());
}
#region Shortcuts
private void frmSearch_KeyDown(object sender, KeyEventArgs e)
{
if ((e.KeyCode == Keys.Escape) || (e.KeyCode == Keys.Enter))
Close();
}
#endregion
namespace dynamicGridFilter
{
/// <summary>
/// This struct contains information about each field to be filtered along with filter value, if exists.
/// </summary>
public struct field {
public string Field;
public string FriendlyName;
public string Value;
}
}
namespace dynamicGridFilter
{
public delegate void SearchContextChangedHandler(List<field> fields);
}
Complete source code available to download:
Includes full source code and compiled binary (use it at your own risk)dynamicGridFilter.zip (50,23 KB)
What's next?!
If could have gone all the way up to creating a custom control that inherits from DataGridView and has all the logic embedded. Well, you have here all you need for doing it yourself, so don't call me lazy! :P
Comments are welcome!