简体   繁体   English

如何在列表框中查找项目?

[英]How to find items in a ListBox?

I am creating an application where I have a ListBox which has items that are read in from a text file using StreamReader . 我正在创建一个应用程序,其中有一个ListBox ,其中包含使用StreamReader从文本文件读取的项目。 I have created a search form but I'm not sure what to do next. 我已经创建了一个搜索表单,但不确定下一步该怎么做。 Can anyone give me some suggestions please? 有人可以给我一些建议吗? Here is my code: 这是我的代码:

My code for the ListBox (sorry it's so long) 我的ListBox代码(很长很抱歉)

public partial class frmSwitches : Form
{
    public static ArrayList switches = new ArrayList();
    public static frmSwitches frmkeepSwitches = null;
    public static string inputDataFile = "LeckySafe.txt";
    const int numSwitchItems = 6;
    public frmSwitches()
    {
        InitializeComponent();
        frmkeepSwitches = this;
    }

    private void btnDevices_Click(object sender, EventArgs e)
    {
        frmDevices tempDevices = new frmDevices();
        tempDevices.Show();
        frmkeepSwitches.Hide();
    }

    private bool fileOpenForReadOK(string readFile, ref StreamReader dataIn)
    {
        try
        {
            dataIn = new StreamReader(readFile);
            return true;
        }
        catch (FileNotFoundException notFound)
        {
            MessageBox.Show("ERROR Opening file (when reading data in) - File could not be found.\n"
                + notFound.Message);
            return false;
        }
        catch (Exception e)
        {
            MessageBox.Show("ERROR Opening File (when reading data in) - Operation failed.\n"
                + e.Message);
            return false;
        }

    }

    private bool getNextSwitch(StreamReader inNext, string[] nextSwitchData)
    {
        string nextLine;
        int numDataItems = nextSwitchData.Count();

        for (int i = 0; i < numDataItems; i++)
        {
            try
            {
                nextLine = inNext.ReadLine();
                if (nextLine != null)
                    nextSwitchData[i] = nextLine;
                else
                {
                    return false;
                }
            }
            catch (Exception e)
            {
                MessageBox.Show("ERROR Reading from file.\n" + e.Message);
                return false;
            }
        }
        return true;
    }

    private void readSwitches()
    {
        StreamReader inSwitches = null;
        Switch tempSwitch;
        bool anyMoreSwitches = false;
        string[] switchData = new string[numSwitchItems];

        if (fileOpenForReadOK(inputDataFile, ref inSwitches))
        {
            anyMoreSwitches = getNextSwitch(inSwitches, switchData);

            while (anyMoreSwitches == true)
            {
                tempSwitch = new Switch(switchData[0], switchData[1], switchData[2], switchData[3], switchData[4], switchData[5]);

                switches.Add(tempSwitch);

                anyMoreSwitches = getNextSwitch(inSwitches, switchData);
            }
        }

        if (inSwitches != null) inSwitches.Close();
    }

    public static bool fileOpenForWriteOK(string writeFile, ref StreamWriter dataOut)
    {
        try
        {
            dataOut = new StreamWriter(writeFile);
            return true;
        }
        catch (FileNotFoundException notFound)
        {
            MessageBox.Show("ERROR Opening file (when writing data out)" +
                "- File could not be found.\n" + notFound.Message);
            return false;
        }
        catch (Exception e)
        {
            MessageBox.Show("ERROR Opening File (when writing data out)" +
                "- Operation failed.\n" + e.Message);
            return false;
        }

    }

    public static void writeSwitches()
    {
        StreamWriter outputSwitches = null;

        if (fileOpenForWriteOK(inputDataFile, ref outputSwitches))
        {
            foreach (Switch currSwitch in switches)
            {
                outputSwitches.WriteLine(currSwitch.getSerialNo());
                outputSwitches.WriteLine(currSwitch.getType());
                outputSwitches.WriteLine(currSwitch.getInsDate());
                outputSwitches.WriteLine(currSwitch.getElecTest());
                outputSwitches.WriteLine(currSwitch.getPatId());
                outputSwitches.WriteLine(currSwitch.getNumDevice());

            }
            outputSwitches.Close();
        }

        if (outputSwitches != null) outputSwitches.Close();
    }

    private void showListOfSwitches()
    {
        lstSwitch.Items.Clear();

        foreach (Switch b in switches)
            lstSwitch.Items.Add(b.getSerialNo()
                + b.getType() + b.getInsDate()
                + b.getElecTest() + b.getPatId() + b.getNumDevice());
    }

My code for the search form: 我的搜索表单代码:

private void btnSearch_Click(object sender, EventArgs e)
    {
        frmSearchSwitch tempSearchSwitch = new frmSearchSwitch();
        tempSearchSwitch.Show();
        frmkeepSwitches.Hide();
    } 

If using a List<T> and lambda is not possible for you then go no farther. 如果无法使用List<T>和lambda,则不再走。

Here I use a List<T> for the data source of a ListBox and mocked up data as where the data comes from is not important but here I am focusing on searching on a property within a class where a select is used to index the items then the where searches in this case) for a specific item, if found the index is used to move to the item. 在这里,我使用List<T>作为ListBox的数据源,并模拟了数据,因为数据的来源并不重要,但在这里,我着重于搜索使用select索引项目的类中的属性然后在这种情况下,在哪里搜索)特定项目(如果找到),则使用索引将其移至该项目。 No code present for if not located as this is easy for you to do if the code here is something that is doable for you. 如果没有找到,则不存在任何代码,因为如果此处的代码对您而言可行,那么您很容易这样做。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace ListBoxSearch_cs
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Button1_Click(object sender, EventArgs e)
        {
            var results =
                ((List<Item>)ListBox1.DataSource)
                    .Select((data, index) => new 
                    { Text = data.SerialNumber, Index = index })
                    .Where((data) => data.Text == "BB1").FirstOrDefault();
            if (results != null)
            {
                ListBox1.SelectedIndex = results.Index;
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            var items = new List<Item>() {
            new Item {Identifier = 1, SerialNumber = "AA1", Type = "A1"},
            new Item {Identifier = 2, SerialNumber = "BB1", Type = "A1"},
            new Item {Identifier = 3, SerialNumber = "CD12", Type = "XD1"}
        };
            ListBox1.DisplayMember = "DisplayText";
            ListBox1.DataSource = items;
        }
    }
    /// <summary>
    /// Should be in it's own class file
    /// but done here to keep code together
    /// </summary>
    public class Item
    {
        public string SerialNumber { get; set; }

        public string Type { get; set; }

        public int Identifier { get; set; }

        public string DisplayText
        {
            get
            {
                return SerialNumber + " " + this.Type;
            }
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM