1 回答
TA贡献1808条经验 获得超4个赞
我猜你可能指的是“搜索”而不是“过滤器”。如果您想在用户输入字符后立即“搜索”某些内容,那么在大多数情况下,当用户在文本框中输入单个字符时,该searchId_TextChange
事件将触发。在这种情况下,代码似乎是从单个字符“过滤”“Id”。除非表格中有一个单元格等于用户输入的值(在本例中不会有,因为它是单个字符)……这很可能会使网格处于“空”状态给用户,因为过滤器不会返回任何匹配项。
因此,由于看起来您想要一行,那么在用户输入“确切”完整数字之前,该行不会出现。在应用过滤器之前等待用户输入 x 个字符可能是有益的。或者只需在文本框旁边添加一个“搜索”按钮。我猜这可能对用户更友好。
最后,为了帮助,下面是使用的两个例子List<T>
和DataTable
作为DataSources
两个DataGridViews
我将承担NpcDrop
财产ID
是int
。在这个例子中ID
是一个int
. 在DataTable
示例中,ID
定义为string
。添加几个文本框,表单可能如下所示。
左边的网格有一个List<NcpDrop>
作为数据源。右侧的网格中使用的DataTable
作为DataSource
。最初fullNPCDropsList
和gridTable
填充了相同的数据。两个文本框TextChanged
事件连接起来以“过滤”网格。
当对 应用“过滤器”时List<NcpDrop>
,List<NcpDrop>
filterList
会创建一个新的并填充所有ID
匹配的s。这个新的List<NcpDrop>
被用作网格DataSource
。
当一个“过滤器”被应用到DataTable
a newDataView
filterData
是从初始创建的DataTalbe
, aRowFilter
被应用到DataView
基于文本框中的文本。这DataView
随后被用作一个数据源`到电网。
从图片(下图)可以看出,左侧网格将保持“空”状态,直到用户输入“整个”数字。另一方面,当用户键入更多字符时,右侧的网格将过滤列表项。右侧的网格以五 (5) 位数字显示所有类似于“20102”的项目。左侧的网格将保持为空,直到用户键入第六 (6) 位数字。
总之,目前尚不清楚确切的要求是什么,以及从用户的角度来看什么是最好的方法。如果用户正在搜索一个数字并且数据是一个数字,我猜您将需要做更多的工作,因为如果不使用等于、小于、大于等功能,此功能将不可用……
List<NpcDrop> fullNPCDropsList;
DataTable gridTable;
public Form1() {
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e) {
fullNPCDropsList = GetData1();
dgvListData.DataSource = fullNPCDropsList;
gridTable = GetData2();
dgvDataTableData.DataSource = gridTable;
}
private List<NpcDrop> GetData1() {
List<NpcDrop> drop = new List<NpcDrop>();
int start = 201000;
for (int i = 0; i < 100; i++) {
drop.Add(new NpcDrop(++start));
}
return drop;
}
private DataTable GetData2() {
DataTable dt = new DataTable();
dt.Columns.Add("ID", typeof(string));
int start = 201000;
for (int i = 0; i < 100; i++) {
dt.Rows.Add((++start).ToString());
}
return dt;
}
private void txtListSearchBox_TextChanged(object sender, EventArgs e) {
if (txtListSearchBox.Text == "") {
dgvListData.DataSource = fullNPCDropsList;
}
else {
if (int.TryParse(txtListSearchBox.Text, out int value)) {
List<NpcDrop> filterList = fullNPCDropsList.FindAll(x => x.ID.Equals(value));
dgvListData.DataSource = filterList;
}
}
}
private void txtDTSearchBox_TextChanged(object sender, EventArgs e) {
if (txtDTSearchBox.Text == "") {
dgvDataTableData.DataSource = gridTable;
}
else {
DataView filterData = new DataView(gridTable);
filterData.RowFilter = "ID LIKE '%" + txtDTSearchBox.Text + "%'";
dgvDataTableData.DataSource = filterData;
}
}
希望这可以帮助。
- 1 回答
- 0 关注
- 594 浏览
添加回答
举报