Фильтр ListBox с TextBox в режиме реального времени - PullRequest
5 голосов
/ 03 апреля 2012

Я пытаюсь отфильтровать список с текстом из текстового поля, 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();
}

Вот вопросы:

  1. Когда я запускаю программу, я получаю эту ошибку: Object reference not set to an instance of an object

  2. Если я нажму клавишу Backspace, мой первоначальный список больше не будет отображаться. Это потому, что мой фактический список предметов теперь уменьшен, но как мне этого добиться?

Можете ли вы указать мне правильное направление?

Ответы [ 6 ]

6 голосов
/ 03 апреля 2012

Трудно вычесть только из кода, но я предполагаю вашу проблему фильтрации, обусловленную различными аспектами:

a) Вам нужно Model данных, показанных на ListBox.Вам нужна коллекция «Предметов», которую вы где-то держите (Dictionary, DataBase, XML, BinaryFile, Collection), что-то вроде Store вкратце.

Чтобы показать данные в пользовательском интерфейсе, вы всегда выбираете данные из этого хранилища , фильтруете их и помещаете в пользовательский интерфейс.

б) После первой точки ваш код фильтрации может выглядеть следующим образом ( псевдокод )

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();

Надеюсь, это поможет.

0 голосов
/ 29 января 2019

это была очень сложная проблема для меня, но я нашел обходной путь (не такой простой), который мне подходит.

на странице 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 (), который переписывает введенное текстовое значение, потерянное при обратной передаче, и фокусируется на нем.

Наслаждайтесь им.

0 голосов
/ 15 мая 2018

Я бы сделал это так:

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();
}

Просто не забудьте заполнить регистрационные списки при первом заполнении списка.

Надеюсь, это поможет.

0 голосов
/ 22 июня 2017

Если возможно, сохраните все в словаре и просто заполните его оттуда.

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();
}
}
0 голосов
/ 03 апреля 2012

Да, это был ответ на фильтрацию. (немного изменено). У меня была информация в текстовом файле. Вот что у меня сработало

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();

Кажется, что ошибка:

Ссылка на объект не установлена ​​для экземпляра объекта

откуда-то еще в моем коде, я не могу указать на это.

0 голосов
/ 03 апреля 2012

Что-то вроде этого может работать для вас:

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());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...