2017-07-31 18 views
0

私は、テキストボックスのオートコンプリートを作成しようとしているロードブロックにヒットしました。部分文字列の.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; 

ヘッドは少し揚げあります。私はユーザーがウェブサイトにテキストボックスに入るたびにオートコンプリートを作成しようとしていますが、それは .txtファイルのウェブサイトの最も類似した既存のエントリを見つけようとします(テキストボックスの 'face'存在する場合は「facebook」を提案する)

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

これらのコンパイルはありません。

私はString.Split( '=')を使用することを考えていましたが、私が考えることができる唯一の方法は文字通りすべての行の個別配列を作成し、credentialarray [0]を返すことですウェブサイト)。

ヘルプ!あなたは正しい軌道string.splitにある

+0

コンパイルエラーは何ですか? – Atlasmaybe

答えて

1

は、最も簡単な解決策

ですが、あなたがするウェブサイト、ユーザ名、パスワードの組み合わせが必要な場合は、この

 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&simple answer –

+0

しかし、1つの質問ですが、オートコンプリートを記入するために可能性を繰り返すと少しちらつきます。別のスレッドを使用してイベントを処理すると、検索時にちらつきの量が減りますか?もし私がフォームロードイベントでファイルをプリロードするとしたら? –

+0

いいえマルチスレッドでちらつきの問題が解決されるとは思いません。オートコンプリートデータを含むソースファイルの大きさはどれくらいですか? – ClearLogic

2

あなたcode.tryに誤りがありますこれらのアイテムを格納できるシンプルなクラスを作成し、ファイルラインの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; 
    } 
} 

次に、テキストファイルを解析するときに、各行に対してこれらのファイルの1つを作成し、リストに格納することができます。この1つの利点は、あなたが今、あなたはどちらのサイトのユーザー名とパスワードをルックアップするために使用することができますリストを持っているということです

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

:次に、あなたのテキストボックスのオートコンプリートに各リスト項目のWebsiteプロパティをバインドすることができます彼らは以下を選択しました:

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

var userName = userSelection?.UserName; 
var password = userSelection?.Password; 
関連する問題