c# - 简单但令人沮丧的列表框和文本框再次搜索

标签 c# winforms indexing

我花了几天时间到处寻找解决方案。 这是针对使用 Visual Studio 2013 的 C#(是的,我是新手):

  • 两个文本框(姓氏和名字)和一个包含 5 个姓名的列表框(Higgins M、Higgins J、King J、Tran A、Dempsey S)。我将列表框属性设置为已排序。
  • 如果我在列表框中选择 Higgins J,则 Higgins 一词应出现在姓氏文本框中,而 J 应出现在名字文本框中。
  • 如果我在姓氏文本框中输入 Higgins,Higgins J 应该是列表框中的选定项(Higgins J 将在 Higgins M 之前被选择)。如果我在“名字”文本框中输入 M,所选项目应从 Higgins J 更改为 Higgins M。

但是......以下问题让我决定在这里创建一个帐户:

  1. 如果我输入 Hi 或 Hig 而不是 Higgins,它必须保持这种状态,它不会在文本框中变成 Higgins。仅更改列表框中的索引/突出显示,而不更改文本框中的条目(无论我在文本框中输入什么内容都会保留)。我怀疑我使用的事件是我无法完成此任务的原因。 Textbox_textchanged 和 listbox_selectedindexchanged。因此,无论我在一个事件中做什么,都会自动触发另一个事件。我曾尝试改变事件,但到目前为止,结果更糟。使用: if (LastName_textbox.Text = "") 也没有帮助。

  2. 如何将姓氏和名字合并为一个索引?

如果这个问题出现或听起来模棱两可,我深表歉意。我想我不知道如何表达搜索以获得与我的问题类似的内容,而且英语不是我的母语。非常感谢任何帮助。谢谢。

以下是部分代码:

using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Project
{
public partial class frmContact : Form
{
    //declare file to save all contacts    
    private string fileName = Directory.GetCurrentDirectory() + "\\Contacts.txt";
    //create temporary file for updating and deleting contacts        
    private string newContacts = Directory.GetCurrentDirectory() + "\\newContacts.txt";

    public frmContact()
    {
        InitializeComponent();
    }

    private void frmContact_Load(object sender, EventArgs e)
    {
        //create Contacts.txt if it does not exist
        if (!File.Exists(fileName))
        {
            File.Create(fileName).Close();
            MessageBox.Show("New " + fileName +"  Has Been Created");
            tbLast.Select();
        }
        //if file already exists
        else
        {
            StreamReader readOb = new StreamReader(fileName);
            using (readOb)
            { 
                while (!readOb.EndOfStream)
                {
                    string rdLine = readOb.ReadLine(); //read data in file by line
                    string[] tmpArr = rdLine.Split(',');
                    lbContact.Items.Add(tmpArr[0] + "," + tmpArr[1]);
                }
                tbLast.Select();
            }

        }
    }

    private void lbContact_SelectedIndexChanged(object sender, EventArgs e)
    {
        //show details of contact selected in listbox
        string findNames = lbContact.GetItemText(lbContact.SelectedItem);
        StreamReader obRead = new StreamReader(fileName);
        using (obRead)
        {
            while (!obRead.EndOfStream)
            {
                string rdLine = obRead.ReadLine();
                if (rdLine.StartsWith(findNames))
                {
                    string[] tmpArr = rdLine.Split(',');
                    tbLast.Text = tmpArr[0];
                    tbFirst.Text = tmpArr[1].Trim();
                    tbAddr.Text = tmpArr[2].Trim();
                    tbSub.Text = tmpArr[3].Trim();
                    tbPost.Text = tmpArr[4].Trim();
                    tbEmail.Text = tmpArr[5].Trim();
                    tbPhone.Text = tmpArr[6].Trim();
                    tbMob.Text = tmpArr[7].Trim();
                }
            }
            lbContact.SelectedIndex = lbContact.FindString(findNames);
        }
    }

    private void tbLast_TextChanged(object sender, EventArgs e)
    {
        lbContact.SelectedItem = lbContact.FindString(tbLast.Text);
    }

最佳答案

一个简单(但有点丑陋的解决方案)包括使用 bool 值来通知您的 lbContact_SelectedIndexChanged方法是通过代码手动更改索引。类(class)成员会完成这项工作,例如:

private bool fromCode;

private void lbContact_SelectedIndexChanged(object sender, EventArgs e)
{
    if (fromCode)
       return;

    // Do the job
}

private void tbLast_TextChanged(object sender, EventArgs e)
{
    fromCode = true;
    lbContact.SetSelected(lbContact.FindString(tbLast.Text), true);
    fromCode = false;
}

[个人备注] 我还会创建一个 Contact struct/class 将您的信息与表单中的集合一起存储,以便您只需访问文件两次:

  • 加载时,以便您可以填充您的集合
  • 关闭时,以便您可以保存对文件的更改

[更新] 我的最后一句话可能不相关,因为我不了解您开发应用程序的上下文,这就是为什么我说这是个人观点,您不必这样做。

[更新2]

如何避免每次 lbContact_SelectedIndexChanged 时访问您的文件事件被称为:

  • 创建一个结构体或类来存储您的联系人信息(名字、姓氏、地址……)
  • 创建一个包含联系人的集合(作为表单的类成员)(例如 List<Contact> )
  • 在您的frmContact_Load中方法,用文件中包含的数据填充此集合,而不是填充列表框
  • 所以在你的 lbContact_SelectedIndexChanged您将在集合中搜索而不是打开文件的方法
  • 您的 Add() 和 Delete() 操作还必须修改集合而不是文件
  • 请记住在申请关闭时将您的收藏保存回您的文件中

希望有帮助。

关于c# - 简单但令人沮丧的列表框和文本框再次搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25244243/

相关文章:

c# - 通过 Microsoft.Office.Interop.Excel 确定 Excel 版本/文化

MYSQL - 使用 where 和 filesort

MySQL查询不使用索引

python - 如何找到列表中项目的索引,但不是完全匹配

c# - 如何验证用户是否属于 C#.NET 中的 Active Directory 用户组

c# - 用于数据访问的 PHP + .Net Web 服务 - 糟糕的设计选择?

c# - 如果一次运行一个单元测试,则单元测试通过良好,如果运行 "All Tests in Solution",则 FileLoadException

c# - 如何使用 .net 在远程计算机上启动/停止/重新启动 Windows 服务

c# - 如何在 TreeView 控件中显示滚动条

c# - 如何在未选中 ShowCheckBox 的情况下加载 DateTimePicker