2017-07-31 152 views
0

我打了一個包版,試圖爲我的文本框創建一個AutoCompletion。閱讀.txt的子字符串,爲AutoCompleteSource返回子字符串

嘗試#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; 

頭是有點炸。我試圖在用戶輸入一個文本框的時候創建一個AutoCompletion,它會嘗試在 .txt文件中找到最相似的網站的現有條目(想象一下,在文本框中輸入'face',會如果存在,建議'臉書')

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

這些都沒有編譯。

我正在考慮使用String.Split('='),但我能想到的唯一方法是通過創建一個單獨的數組用於每行,然後返回credentialarray [0](因爲這將是網站)。

幫助!

+0

什麼是編譯錯誤? – Atlasmaybe

回答

1

你是在正確的軌道上string.split是最簡單的解決方案

但也有你的code.try錯誤此

 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; 
+0

這個效果非常好! +1對於LINQ和簡單的回答 –

+0

雖然有一個問題,當它遍歷各種可能性以填充自動完成時,我會輕微閃爍。如果我使用單獨的線程來處理事件,它會在搜索時減少閃爍的數量嗎?也許如果我預加載文件在表單加載事件? –

+0

不,我不認爲多線程可以解決閃爍的問題。包含自動完成數據的源文件有多大? – ClearLogic

2

如果你需要的網站,用戶名和密碼的組合是存儲在一起,我會創建一個可以存放這些項目一個簡單的類,並且知道如何通過解析您的文件中的行之一創建本身,就像這樣:

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

然後,當你解析你的文本文件時,你可以爲每一行創建其中的一個並將它們存儲在一個List中。然後,你可以在每個列表項的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;