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


两个文本框(姓氏和名字)和一个具有5个名称的列表框(希金斯M,希金斯J,国王J,Tran A,登普西S)。我将listbox属性设置为已排序。
如果在列表框中选择“希金斯J”,则“希金斯”一词应出现在“姓氏”文本框中,而“ J”应出现在“名字”文本框中。
如果在“姓氏”文本框中键入“希金斯”,则希金斯J应该是列表框中的选定项(“希金斯J”将在“希金斯M”之前被选择)。如果在“名字”文本框中键入M,则所选项目应从“希金斯J”更改为“希金斯M”。


但是....以下是让我决定在此处创建帐户的问题:


如果我键入Hi或Hig而不是Higgins,则必须保持这种方式,它不会在文本框中成为Higgins。仅更改列表框中的索引/突出显示,而不更改文本框中的条目(无论我在文本框中键入的内容如何)。我怀疑我使用的事件是无法完成此操作的原因。更改了textbox_textchanged和listbox_selectedindex。因此,无论我在一个事件中做什么,都会自动触发另一个事件。我已尝试更改事件,但到目前为止结果简直更糟。使用:if(LastName_textbox.Text =“”)也没有帮助。
如何将姓氏和名字作为一个索引?


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

这是部分代码:

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

最佳答案

一个简单(但很丑陋的解决方案)是使用一个布尔值来通知您的lbContact_SelectedIndexChanged方法,由于该代码,索引已手动更改。一个班级成员会完成这项工作,例如:

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结构/类,以将您的信息以及一个集合存储在您的表单中,这样您只需访问文件两次:


加载时,以便您可以填充收藏集
在关闭时,您可以将更改保存到文件中


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

[更新2]

避免在每次调用lbContact_SelectedIndexChanged事件时访问文件的方法:


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


希望能有所帮助。

08-28 12:48