2017-07-31 2 views
0

J'ai rencontré un roadblock en essayant de créer une AutoCompletion pour ma zone de texte.Lecture de fichiers .txt pour les sous-chaînes, retour de sous-chaînes pour AutoCompleteSource

Tentative # 1

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

Tentative # 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; 

Head est un peu frit. J'essaie de faire un AutoCompletion pour chaque fois que l'utilisateur entre dans un site Web dans une zone de texte, il va essayer de trouver l'entrée existante la plus similaire du site dans le fichier .txt (imaginez saisir dans 'face' dans la zone de texte, suggérer 'facebook' s'il existe)

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

Aucun de ces documents. Je pensais utiliser String.Split ('='), mais la seule façon de le faire est de créer un tableau individuel pour littéralement chaque ligne et de renvoyer credentialarray [0] (parce que cela serait le site Web).

Aide!

+0

Quelle est l'erreur de compilation? – Atlasmaybe

Répondre

1

vous êtes sur la bonne voie string.split est la solution la plus simple

mais il y a des erreurs dans votre code.try ce

 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

Cela fonctionne si bien! +1 Pour LINQ & réponse simple –

+0

Une question cependant, je reçois un léger scintillement quand il itère à travers les possibilités afin de remplir la saisie semi-automatique. Si je devais utiliser des threads séparés pour gérer l'événement, cela réduirait-il le scintillement lors de la recherche? Peut-être que si je précharge le fichier sur un événement de chargement de formulaire? –

+0

Non, je ne pense pas que le multi-thread résoudrait le problème de scintillement. Quelle est la taille du fichier source contenant les données de saisie semi-automatique? – ClearLogic

2

Si vous avez besoin de la combinaison de site, le nom d'utilisateur et mot de passe pour être stockés ensemble, je créerais une classe simple qui permet de stocker ces éléments, et qui sait se créer en analysant l'une de vos lignes de fichiers, comme ceci:

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

Ensuite, lorsque vous analysez votre fichier texte, vous pouvez simplement en créer un pour chaque ligne et les stocker dans une liste. Ensuite, vous pouvez lier la propriété Website de chaque élément de la liste à votre zone de texte de-complet automatique:

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

Un avantage de ceci est que vous avez maintenant une liste que vous pouvez utiliser pour rechercher le nom d'utilisateur et mot de passe pour tout site où ils ont choisi:

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

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