使用TextBox实时筛选ListBox
本文关键字:ListBox 筛选 实时 TextBox 使用 | 更新日期: 2023-09-27 18:29:58
我正在尝试用文本框realTime中的文本过滤列表框。
这是代码:
private void SrchBox_TextChanged_1(object sender, EventArgs e)
{
var registrationsList = registrationListBox.Items.Cast<String>().ToList();
registrationListBox.BeginUpdate();
registrationListBox.Items.Clear();
foreach (string str in registrationsList)
{
if (str.Contains(SrchBox.Text))
{
registrationListBox.Items.Add(str);
}
}
registrationListBox.EndUpdate();
}
问题如下:
当我运行程序时,我得到这个错误:
Object reference not set to an instance of an object
如果我按退格键,我的初始列表将不再显示。这是因为我的实际项目列表现在减少了,但我如何才能做到这一点?
你能给我指正确的方向吗?
仅从代码中很难推断,但我认为您的过滤问题来自不同方面:
a) 您需要ListBox
上显示的数据的Model
。您需要一个存放在某个地方的"物品"集合(Dictionary
、DataBase
、XML
、BinaryFile
、Collection
),简而言之,就是某种商店。
要在UI上显示数据,总是从存储中选择数据,过滤并将其放在UI上。
b) 在第一个点之后,您的过滤代码可以看起来像这样(伪代码)
var registrationsList = DataStore.ToList(); //return original data from Store
registrationListBox.BeginUpdate();
registrationListBox.Items.Clear();
if(!string.IsNullOrEmpty(SrchBox.Text))
{
foreach (string str in registrationsList)
{
if (str.Contains(SrchBox.Text))
{
registrationListBox.Items.Add(str);
}
}
}
else
registrationListBox.Items.AddRange(registrationsList); //there is no any filter string, so add all data we have in Store
registrationListBox.EndUpdate();
希望这能有所帮助。
这样的东西可能对你有用:
var itemList = registrationListBox.Items.Cast<string>().ToList();
if (itemList.Count > 0)
{
//clear the items from the list
registrationListBox.Items.Clear();
//filter the items and add them to the list
registrationListBox.Items.AddRange(
itemList.Where(i => i.Contains(SrchBox.Text)).ToArray());
}
是的,这就是过滤的答案。(修改了一点)。我有一个文本文件中的信息。这就是对我有效的
FileInfo registrationsText = new FileInfo(@"name_temp.txt");
StreamReader registrationsSR = registrationsText.OpenText();
var registrationsList = registrationListBox.Items.Cast<string>().ToList();
registrationListBox.BeginUpdate();
registrationListBox.Items.Clear();
if (!string.IsNullOrEmpty(SrchBox.Text))
{
foreach (string str in registrationsList)
{
if (str.Contains(SrchBox.Text))
{
registrationListBox.Items.Add(str);
}
}
}
else
while (!registrationsSR.EndOfStream)
{
registrationListBox.Items.Add(registrationsSR.ReadLine());
}
registrationListBox.EndUpdate();
似乎错误:
对象引用未设置为对象的实例
来自我代码中的其他地方,无法将手指放在上面。
如果可以,将所有内容存储在字典中,然后从那里填充。
public partial class myForm : Form
{
private Dictionary<string, string> myDictionary = new Dictionary<string, string>();
//constructor. populates the items. Assumes there is a listbox (myListbox) and a textbox (myTextbox), named respectively
public myForm()
{
InitializeComponent();
myDictionary.Add("key1", "item1");
myDictionary.Add("key2", "My Item");
myDictionary.Add("key3", "A Thing");
//populate the listbox with everything in the dictionary
foreach (string s in myDictionary.Values)
myListbox.Add(s);
}
//make sure to connect this to the textbox change event
private void myTextBox_TextChanged(object sender, EventArgs e)
{
myListbox.BeginUpdate();
myListbox.Items.Clear();
foreach (string s in myDictionary.Values)
{
if (s.Contains(myListbox.Text))
myListbox.Items.Add(s);
}
myListbox.EndUpdate();
}
}
我会这样做:
private List<string> registrationsList;
private void SrchBox_TextChanged_1(object sender, EventArgs e)
{
registrationListBox.BeginUpdate();
registrationListBox.Items.Clear();
var filteredList = registrationList.Where(rl => rl.Contains(SrchBox.Text))
registrationListBox.Items.AddRange();
registrationListBox.EndUpdate();
}
只需记住在第一次填写列表框时填写registrationsList即可。
希望这能有所帮助。
这对我来说是一个非常困难的问题,但我找到了一个对我来说很好的解决方法(不那么简单)。
在aspx页面上:
<input id="ss" type="text" oninput="writeFilterValue()"/>
<asp:HiddenField ID="hf1" runat="server" Value="" ClientIDMode="Static" />
我需要HTML输入类型,因为"oninput"函数在经典的asp.net控件上不可用。writeFilterValue()函数会导致一个回发,该回发过滤给定ListBox的值(代码隐藏)。
我定义了两个javascript函数:
<script type="text/javascript">
function writeFilterValue() {
var bla = document.getElementById("ss").value;
$("#hf1").val(bla)
__doPostBack();
}
function setTboxValue(s) {
document.getElementById('ss').value = s;
document.getElementById('ss').focus();
}
</script>
现在,每当在输入框上键入某个字符时,您可以在代码隐藏上使用回发来捕获hf1值。在代码背后:
If IsPostBack Then
FiltraLbox(hf1.Value)
End If
函数FiltraLbox(hf1.Value)更改Listbox的数据源,并重新绑定它:
Public Sub FiltraLbox(ByVal hf As String)
If hf <> "" Then
' change datasource here, that depends on hf value,
ListBox1.DataBind()
ScriptManager.RegisterStartupScript(Page, Page.GetType(), "text", setTboxValue('" + hf + "');", True)
End If
End Sub
最后,我调用函数setTboxValue(),它重写回发时丢失的输入文本值,并将重点放在它上
享受吧。