【问题标题】:Reading .txt for substrings, returning substrings for AutoCompleteSource读取 .txt 的子字符串,返回 AutoCompleteSource 的子字符串
【发布时间】:2017-07-31 15:49:01
【问题描述】:

我在尝试为我的文本框创建自动完成时遇到了障碍。

尝试 #1

string[] fileDB = Account.filedbContents;
string[] lines = { };
using (StreamReader sr = new StreamReader(@FILE_PATH)
while ((textboxWebsite.Text = sr.ReadLine()) != null)
{
    lines.Add(sr.ReadLine());
}

尝试 #2

textboxWebsite.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
textboxWebsite.AutoCompleteSource = AutoCompleteSource.CustomSource;
var autoComplete = new AutoCompleteStringCollection();
autoComplete.AddRange()


string[] substrings = new string[] { textboxWebsite.Text };
substrings.SelectMany(substring => Enumerable.Range(0, ))
string line = File.Read(@"C:\Users\snogueir\Desktop\Coding\sandbox\keychainarray.txt");
}

AutoCompleteStringCollection collection = new AutoCompleteStringCollection();
collection.AddRange(arr);

this.textboxWebsite.AutoCompleteCustomSource = collection;

头有点炸。我正在尝试为每当用户将网站输入文本框时进行自动完成,它将尝试在 .txt 文件(想象在文本框中输入“face”,如果存在则建议“facebook”)

website1=username1=password1
website2=username2=password2
website3=username3=password3

这些都不编译。

我正在考虑使用 String.Split('='),但我能想到的唯一方法是为每一行创建一个单独的数组,然后返回 credentialarray[0](因为那将是网站)。

救命!

【问题讨论】:

  • 什么是编译错误?

标签: c# .net winforms autocomplete textbox


【解决方案1】:

如果您需要将网站、用户名和密码的组合存储在一起,我会创建一个简单的类来存储这些项目,并且它知道如何通过解析您的文件行之一来创建自己,如下所示:

class FileEntry
{
    public string Website { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }

    public static FileEntry Parse(string fileLine)
    {
        var result = new FileEntry();
        if (string.IsNullOrWhiteSpace(fileLine)) return result;

        var lineParts = fileLine.Split('=');

        result.Website = lineParts[0];
        if (lineParts.Length > 1) result.UserName = lineParts[1];
        if (lineParts.Length > 2) result.Password = lineParts[2];

        return result;
    }
}

然后,当您解析文本文件时,您可以为每一行创建其中一个并将它们存储在一个列表中。然后,您可以将每个列表项的 Website 属性绑定到文本框的自动完成功能:

// Store the list at the class level so other methods can access it:
private List<FileEntry> fileEntries;

private void Form1_Load(object sender, EventArgs e)
{
    var filePath = @"C:\Users\snogueir\Desktop\Coding\sandbox\keychainarray.txt";
    fileEntries = File.ReadAllLines(filePath).Select(FileEntry.Parse).ToList();

    textboxWebsite.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
    textboxWebsite.AutoCompleteSource = AutoCompleteSource.CustomSource;
    var autoComplete = new AutoCompleteStringCollection();
    autoComplete.AddRange(fileEntries.Select(fe => fe.Website).ToArray());
    textboxWebsite.AutoCompleteCustomSource = autoComplete;
}

这样做的一个好处是您现在有了一个列表,您可以使用该列表来查找他们选择的任何站点的用户名和密码:

var userSelection = fileEntries.FirstOrDefault(fe =>
    fe.Website.Equals(textboxWebsite.Text, StringComparison.OrdinalIgnoreCase));

var userName = userSelection?.UserName;
var password = userSelection?.Password;

【讨论】:

    【解决方案2】:

    你在正确的轨道上string.split是最简单的解决方案

    但您的代码中有错误。试试这个

            var lines = from a in File.ReadLines(@"C:\Users\snogueir\Desktop\Coding\sandbox\keychainarray.txt")
                        let b = a.Split('=').FirstOrDefault()
                        select b;
    
            textboxWebsite.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
            textboxWebsite.AutoCompleteSource = AutoCompleteSource.CustomSource;
            var autoComplete = new AutoCompleteStringCollection();
            autoComplete.AddRange(lines.ToArray());           
            textboxWebsite.AutoCompleteCustomSource = autoComplete;
    

    【讨论】:

    • 不过,有一个问题,当它遍历可能性以填写自动完成时,我得到了轻微的闪烁。如果我使用单独的线程来处理事件,它会减少搜索时的闪烁量吗?也许如果我在表单加载事件中预加载文件?
    • 不,我不认为多线程可以解决闪烁问题。包含自动完成数据的源文件有多大?
    • 386 字节。我在原始应用程序中有一个附加到它的保存按钮,但由于它是供个人使用的,我怀疑它的长度会超过约 40 行。
    • 不,它只是表示拆分方法返回的数组中的第一个元素。如果数组为空,则为默认值(在这种情况下为 null)
    • 我发现了问题.. 抱歉,这是由 textbox_textchanged 事件处理的。每次按键都引入自动完成设置必然会导致性能下降。它仍然闪烁,但只是轻微闪烁,并且仍然与 textchanged 事件相关
    猜你喜欢
    • 1970-01-01
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 2021-07-07
    • 1970-01-01
    • 2014-03-17
    • 1970-01-01
    相关资源
    最近更新 更多