使用TextBox和Button在ListBox中搜索项目

时间:2017-12-07 13:42:32

标签: c# winforms

我正在创建一个包含用户插入的ListBox整数的系统。我已经包含一个搜索按钮和一个搜索TextBox,供用户输入他们想要在ListBox内搜索的整数。一旦用户输入了整数,我想要显示一个消息框,要么通知用户存在例如1个整数值' 3'在列表框中,或错误消息框通知用户列表框中不存在整数。

private void buttonSearch_Click(object sender, EventArgs e)
{
    listBoxAddedIntegers.SelectedItems.Clear();
    for (int i = listBoxAddedIntegers.Items.Count - 1;i>=0; i--) ;
    {
        if (listBoxAddedIntegers.Items[i].ToString().ToLower().Contains(textBoxSearch.Text.ToLower())) ;
        {
            listBoxAddedIntegers.SetSelected(i, true);
        }
    }

    // ...
}

我不太确定我要包含在这里的代码,而且我已插入的代码表明' i'在当前内容中不存在。

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

  

我已插入的代码表明' i'在当前内容中不存在

评论中已经提到了@FrankM。在; - 循环后,您有for个跟踪。

for (int i = listBoxAddedIntegers.Items.Count - 1;i>=0; i--) ;

这会阻止for - 循环在{ ... }内执行您的代码。这可以转录为

for (int i = listBoxAddedIntegers.Items.Count - 1;i>=0; i--)
{
    // Do nothing.
}
{
   // now your code
}

这也意味着最后一个花括号内的代码将在其自己的范围内,因此以下代码将无法使用您定义的所有变量。

回答您的实际问题:

正如您已经选择匹配的项目一样。您可以通过计数计数器来扩展此循环。稍后用MessageBox显示结果。

使用以下代码片段

listBoxAddedIntegers.Items[i].ToString().ToLower().Contains(textBoxSearch.Text.ToLower())) 

您目前正在检查列表中的项目是否包含输入的TextBox.Text 因此,如果用户已在ListBox中输入 3,4,5,...,13,23 并搜索 3 。他将获得3场比赛。如果您只想要1个匹配,则应使用String.Equals()。我使用StringComparison.InvariantCultureIgnoreCase来避免调用ToLower()

private void buttonSearch_Click(object sender, EventArgs e)
{
    var counter = 0;

    for (int i = 0; i < this.listBoxAddedIntegers.Items.Count; i++)
    {
        var item = this.listBoxAddedIntegers.Items[i];
        if (string.Equals(item.ToString(), this.textBoxSearch.Text, StringComparison.InvariantCultureIgnoreCase))
        {
            this.listBoxAddedIntegers.SelectedItems.Add(item);
            counter++;
        }
    }

    if (counter == 0)
    {
        MessageBox.Show($"No matches for \"{this.textBoxSearch.Text}\" found!", "Search Results",
                        MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
    else
    {
        MessageBox.Show($"{counter} items found for \"{this.textBoxSearch.Text}\"!", "Search Results",
                        MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
}

提示:
自C#6起,您可以使用string interpolation代替String.Format()或字符串连接(+)。

答案 1 :(得分:0)

{-# LANGUAGE OverloadedStrings #-}
module Datetimetest where

import Data.Time.Format
import Data.Time.Calendar
import Data.Aeson
import Data.Text
import Data.Maybe

newtype Some = Some { date :: Day } deriving Show

instance FromJSON Some where
  parseJSON (Object x) = (x .: pack "date") >>= \v -> Some <$> parseTimeM True defaultTimeLocale "%F" v

test :: Some
test = fromJust $ (decode "{\"date\":\"1999-12-01\"}" :: Maybe Some)

答案 2 :(得分:0)

你必须这样做:

int count=0;

for(int i=0;i<listBoxAddedIntegers.Items.Count;i++)
{
    if(listBoxAddedIntegers.Items[i].Items[i].ToString().ToLower().Contains(textBoxSearch.Text.ToLower())
    {
         count+=1;     
    }
}

if(count>0)
{
     //display your message here after the loop with the count
}
else
{
     //display your message with error
}