我想使用文本框过滤我的DataGridView
项目,该文本框会在键入字母后立即更改结果(在TextChanged
事件中)。
问题是我只找到了使用SQL连接和选择查询的方法。
DataSource
的{{1}}列表:
DataGridView
我public static List<string> listaOsob = new List<string>();
static Osoba nr1 = new Osoba(0, "n0", "f0", 1);
static Osoba nr2 = new Osoba(1, "n1", "f1", 1);
static Osoba nr3 = new Osoba(2, "n2", "f2", 1);
的{{1}}是一个列表,我是这样添加的:
DataSource
非常感谢任何帮助和代码示例。
答案 0 :(得分:2)
我的Osoba课程的班级声明
public class Osoba
{
public int id {get;set;}
public string name1 {get;set;}
public string name2 {get;set;}
public int num {get;set;}
public Osoba(int _id, string _name1, string _name2, int _num)
{
this.id = _id;
this.name1 = _name1;
this.name2 = _name2;
this.num = _num;
}
}
静态声明列表(基于您的代码)
public static List<Osoba> listOsob = new List<Osoba>()
{ new Osoba(0, "n0", "f0", 1)
, new Osoba(1, "n1", "f1", 1)
, new Osoba(2, "n2", "f2", 1)
};
我的表单加载
dataGridView1.DataSource = listOsob;
并在我的文字更改
List<Osoba> newList = new List<Osoba>();
string search = textBox1.Text;
foreach (Osoba item in listOsob)
{
var props = item.GetType().GetProperties();
foreach (var prop in props)
{
if (Convert.ToString(prop.GetValue(item, null)).Contains(search))
{
newList.Add(item);
break;
}
}
}
dataGridView1.DataSource = search == "" ? listOsob : newList;
希望这会有所帮助。
编辑:如果您想指定过滤器,可以像这样编辑过滤器。
foreach (var prop in props)
{
if (
(prop.Name == "name1")
|| (prop.Name == "name2"))
{
if (Convert.ToString(prop.GetValue(item, null)).Contains(search))
{
newList.Add(item);
break;
}
}
}
编辑:如果您的过滤器难以推导,我很抱歉,根据该规范,我建议您对过滤器进行编码,如下所示。替换此
foreach (var prop in props)
{
if (
(prop.Name == "name1")
|| (prop.Name == "name2"))
{
if (Convert.ToString(prop.GetValue(item, null)).Contains(search))
{
newList.Add(item);
break;
}
}
}
用这个
foreach (Osoba item in listOsob)
{
if (
item.name1.Contains(search)
&& item.name2.Contains(search)
)
{
newList.Add(item);
}
}
答案 1 :(得分:0)
为什么你将nr1,nr2,nr3声明为静态?
您可以将类字段用作DataGridView的源代码。 根据您的问题,它可能是:
public class Osoba
{
[DisplayName("Id")]
public int Field1{ get;set; }
[DisplayName("Name")]
public string Field2{ get;set; }
[DisplayName("Name2")]
public string Field3{ get;set; }
[DisplayName("Id2")]
public int Field4{ get;set; }
}
DisplayName 注释将是列名。
此外,您还可以使用注释标记字段: [可浏览(false)] 如果您不希望字段必须显示在表结构中
然后您可以初始化数据集,如:
public static List<Osoba> listaOsob = new List<Osoba>
{
new Osoba(0, "n0", "f0", 1),
new Osoba(1, "n1", "f1", 1),
new Osoba(2, "n2", "f2", 1)
};
最后设置你的datagridView dataSource:
dataGridViewOsob.DataSource = listaOsob;
这应该有效。
讨论使用各种DataSource类型更新textChanged事件的DataGridRow内容here