我正在尝试使用文本框中的文本过滤列表框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
如果我点击退格键,我的初始列表将不再显示。这是因为我的实际物品清单现在减少了,但我怎样才能实现这个目标呢?
你能指出我正确的方向吗?
答案 0 :(得分:6)
很难从代码中扣除,但我推测从不同方面产生的过滤问题:
a)您需要Model
上显示的ListBox
数据。你需要一个“物品”的集合,你在某处(Dictionary
,DataBase
,XML
,BinaryFile
,Collection
),某种存储简而言之。
要在用户界面上显示数据,您始终从该商店中选择数据,过滤它并将其放在用户界面上。
b)在第一点之后,您的过滤代码可能如下所示( a pseudocode )
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();
希望这有帮助。
答案 1 :(得分:0)
这样的事可能适合你:
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());
}
答案 2 :(得分:0)
是的,这是过滤的答案。 (修改了一下)。我在文本文件中有信息。这对我有用
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();
似乎错误:
对象引用未设置为对象的实例
来自我代码中的其他地方,无法将手指放在上面。
答案 3 :(得分:0)
如果能够,请将所有内容存储在字典中,然后从那里填充。
with tags
答案 4 :(得分:0)
我会这样做:
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。
希望这有帮助。
答案 5 :(得分:0)
对我来说这是一个非常困难的问题,但是我发现了一种对我来说很好的解决方法(不是那么简单)。
aspx页面上的
:<input id="ss" type="text" oninput="writeFilterValue()"/>
<asp:HiddenField ID="hf1" runat="server" Value="" ClientIDMode="Static" />
由于“ oninput”功能,我需要HTML输入类型,这在经典的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(),该函数重写回发时丢失的输入文本值,并将重点放在该文本上。
享受吧。