Entwickler-Ecke

WinForms - Autovervollstädigung aus Datei


masterZed - Mi 18.02.09 15:42
Titel: Autovervollstädigung aus Datei
hallo Gemeinde,

ich möchte gerne ganz simple, das meine Textbox die "Autovervollständigung" aus meiner *.txt Datei übernimmt.

zum Testen nahm ich dies hier:



C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
textBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
            textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;

            textBox1.TextChanged += new EventHandler(texBox1_TextChanged);


            // string filenew = @"c:\test.txt";
            // Stringreader sr = new Strinreader(filenew);

            
            
                
            
            col1.AddRange(new string[] { "testa boria""hello boris" });

            textBox1.AutoCompleteCustomSource = col1;
            textBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
        }
        AutoCompleteStringCollection col1 = new AutoCompleteStringCollection();
        AutoCompleteStringCollection col2 = new AutoCompleteStringCollection();


Nun, jetzt möchte ich gerne das er das ganze einfach aus der Datei liest!!

Jemand einen kleine Tipp wie ich vorgehen kann ?

vielen Dank

Moderiert von user profile iconChristian S.: Quote- durch C#-Tags ersetzt


Console.Beep() - Mi 18.02.09 15:51

Du wärst schneller zu deiner Antwort gekommen wenn du die Google suche benutzt oder die hilfe von msdn genutzt hättest
Zum Lesen von Dateien gebe ich dir nur ein Tipp: der Schlüssel liegt bei System.IO
Schau dir die dort befindlichen Klassen an


bakachan - Mi 18.02.09 15:54

Dein Prinzip sollte doch klar sein:
1. Strings aus der Datei auslesen
2. Strings in die AutoCompleteCustomSource stecken

Zum Auslesen wurde ja schon der Tip System.IO Namespace gegeben (besonders die File Klasse darin ist für dich interessant) und das hinzufügen zu CustomSource sollte ja kein Problem sein.


masterZed - Mi 18.02.09 16:04

user profile iconbakachan hat folgendes geschrieben Zum zitierten Posting springen:
Dein Prinzip sollte doch klar sein:
1. Strings aus der Datei auslesen
2. Strings in die AutoCompleteCustomSource stecken

Zum Auslesen wurde ja schon der Tip System.IO Namespace gegeben (besonders die File Klasse darin ist für dich interessant) und das hinzufügen zu CustomSource sollte ja kein Problem sein.


Erstmal besten Dank für die schnelle Antwort. Da ich noch etwas frisch in der Sachen bin würde es mich denoch freuen wenn Du mir ein kleines Bsp. für die übergabe von Stream in die CustomSource geben könntest.

ich bedanke mich...


Console.Beep() - Mi 18.02.09 16:12

Natürlich

Hier ein Beispiel:
http://msdn.microsoft.com/de-de/library/ms228592.aspx

etwas weiter unten kommt dann ein Bsp für c# in sachen I/O

eigendlich musst du nur File.ReadAllText() verwenden der gibt dir einen string aus

desweiteren solltest du dir Galileo openbook anschaun da werden alle grundlagen erklärt


bakachan - Mi 18.02.09 16:42

user profile iconConsole.Beep() hat folgendes geschrieben Zum zitierten Posting springen:
eigendlich musst du nur File.ReadAllText() verwenden der gibt dir einen string aus

File.ReadAllLines wäre wohl sinnvoller das gibt dir gleich ein stringarray(ein string pro zeile in der datei) wieder hat also schon das passende format ums gleich reinzugeben

Edit: obwohl es kommt drauf an wie die vorgaben in der datei vorliegen falls pro vorgabe eine zeile ist dann File.ReadAllLines und falls es anders ist einfach mit File.ReadAllText und dann nachbearbeiten.

Falls du den umständlicheren weg über Streams gehen willst gibts die Klassen StreamReader und TextReader


masterZed - Mi 18.02.09 16:47

user profile iconbakachan hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconConsole.Beep() hat folgendes geschrieben Zum zitierten Posting springen:
eigendlich musst du nur File.ReadAllText() verwenden der gibt dir einen string aus



Falls du den umständlicheren weg über Streams gehen willst gibts die Klassen StreamReader und TextReader


Umständlich? was wäre den der schönste Weg?


bakachan - Mi 18.02.09 17:03

Der meiner meinung nach schönste weg wäre wenn es in der Textdatei zeilenweise vorliegt:

C#-Quelltext
1:
2:
textBox.AutoCompleteCustomSource.Clear();
textBox.AutoCompleteCustomSource.AddRange(System.IO.File.ReadAllLines(path));


masterZed - Mi 18.02.09 17:29

user profile iconbakachan hat folgendes geschrieben Zum zitierten Posting springen:
Der meiner meinung nach schönste weg wäre wenn es in der Textdatei zeilenweise vorliegt:

C#-Quelltext
1:
2:
textBox.AutoCompleteCustomSource.Clear();
textBox.AutoCompleteCustomSource.AddRange(System.IO.File.ReadAllLines(path));


Du hast es auf den Punkt gebracht, das hatte mir gefällt :)

Euch beiden, ein großen Dank für die schnelle Hilfe.


Kleinen frage noch weil es gerade so schön ist.

Nun er leist mir jetzt die ganze Zeile ein (besteht aus 5 Wörtern, getrennt durch komma) und gibt mir dies zur Auswahl an. Es würde mir ausreihen wenn er mir nur das Erste Wort jeder Zeile anbieten würde.

Kleiner Hinweis?

nochmals großen Dank


bakachan - Mi 18.02.09 17:39

Dann geht es leider nicht ganz so schön.
eigenes string[] anlegen und den inhalt der datei entsprechend aufsplitten wie du es haben willst
wenn du jedes wort einzeln haben willst les dir die datei mit File.ReadAllText ein und zerleg es entsprechend(hinweis: string.Split())


masterZed - Do 19.02.09 17:19

user profile iconbakachan hat folgendes geschrieben Zum zitierten Posting springen:
Dann geht es leider nicht ganz so schön.
eigenes string[] anlegen und den inhalt der datei entsprechend aufsplitten wie du es haben willst
wenn du jedes wort einzeln haben willst les dir die datei mit File.ReadAllText ein und zerleg es entsprechend(hinweis: string.Split())


Hi,
das spliten sollte so gehen sein oder?
Zitat:


FileStream oFile = new FileStream(DatenPfad, FileMode.Open, FileAccess.ReadWrite);
StreamReader oStream = new StreamReader(oFile);

String tmp = oStream.ReadLine();
String[] line = tmp.Split(Convert.ToChar(","));


um meine Sachen zu vervollständigen, was fehlt mir noch?


danielf - Do 19.02.09 17:32


C#
1:
2:
AutoCompleteStringCollection acsc = new AutoCompleteStringCollection();
acsc.AddRange(File.ReadAllText(Form1.sAutoCompleteDBName).Split(';'));


masterZed - Do 19.02.09 17:38

user profile icondanielf hat folgendes geschrieben Zum zitierten Posting springen:

C#
1:
2:
AutoCompleteStringCollection acsc = new AutoCompleteStringCollection();
acsc.AddRange(File.ReadAllText(Form1.sAutoCompleteDBName).Split(';'));


oh man... jetzte gehts.
vielen Dank für die mega schnelle Antwort.

ps. Er liest mir mit nur den Ersten String der Zeile eine. Wie sieht das aus wenn er mir den Ersten der gesamten Spalten anzeigen soll?


Kha - Do 19.02.09 20:25

Dazu benutzt du ReadAllLines, rufst für jede Zeile Split auf und fügst das erste Element des Split-Arrays deiner acsc hinzu.


masterZed - Fr 20.02.09 11:52

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
Dazu benutzt du ReadAllLines, rufst für jede Zeile Split auf und fügst das erste Element des Split-Arrays deiner acsc hinzu.


Ein Beispiel sagt mir mehr als 1000 Worte :)

bitte um ein kleine example.


danielf - Fr 20.02.09 12:10

Aus dem Kopf raus ...


C#
1:
2:
3:
4:
5:
6:
7:
8:
AutoCompleteStringCollection acsc = new AutoCompleteStringCollection();

string[] fileContent = File.ReadAllLines();

foreach (string fileLine in fileContent)
{
   acsc.Add(fileLine.Split(';')[0]);
}


Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt


masterZed - Fr 20.02.09 13:43

user profile icondanielf hat folgendes geschrieben Zum zitierten Posting springen:
Aus dem Kopf raus ...


C#
1:
2:
3:
4:
5:
6:
7:
8:
AutoCompleteStringCollection acsc = new AutoCompleteStringCollection();

string[] fileContent = File.ReadAllLines();

foreach (string fileLine in fileContent)
{
   acsc.Add(fileLine.Split(';')[0]);
}


vielen Dank, jetzt bin ich "ERSTMAL" am Ziel.

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt


masterZed - Mo 23.02.09 16:59

Etwas habe ich vergesen und zwar was fehlt, damit der Text nach dem Speichern aktualiesiert wird?
Sprich, die Autovervollständigung erkennt den neuen Eintrag erst nach einem restart.

danke


Kha - Mo 23.02.09 19:13

Nach dem Speichern der txt-Quelle? Dann brauchst du einen FileSystemWatcher: http://msdn.microsoft.com/en-us/library/ch2s8yd7.aspx


masterZed - Mi 25.02.09 09:20

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
Nach dem Speichern der txt-Quelle? Dann brauchst du einen FileSystemWatcher: http://msdn.microsoft.com/en-us/library/ch2s8yd7.aspx


Genau, das könnnte es sein...


masterZed - So 01.03.09 23:25

hmm, ich verstehe nicht genau wie ich den Filewatcher sagen soll, damit er auf meine änderung der Datei reagiert und somit die Autovervollständigung sofort aktualiesiert wird.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
FileSystemWatcher watcher = new FileSystemWatcher(Environment.SystemDirectory);
            watcher.Filter = "*.txt";
            watcher.Path = @"c:\";
            watcher.IncludeSubdirectories = true;
            watcher.NotifyFilter = NotifyFilters.Attributes | NotifyFilters.Size;

            watcher.Changed += new FileSystemEventHandler(watcher_Changed);


Für eine Beispiel bin ich immer dankbar.

thanks all

Moderiert von user profile iconChristian S.: Quote- durch C#-Tags ersetzt


JüTho - Mo 02.03.09 09:44

Hallo,

Dein Code ist doch bestimmt nicht vollständig, oder? Was macht denn watcher_Changed? In der SDK-Doku/MSDN lese ich, dass eine Instanz der WaitForChangedResult-Klasse erstellt werden muss; wo ist die bei Dir?

In der SDK-Doku/MSDN gibt es auch (fast immer) die von Dir gewünschten Beispiele.

Jürgen


masterZed - Mo 02.03.09 20:33

user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:
Hallo,

Dein Code ist doch bestimmt nicht vollständig, oder? Was macht denn watcher_Changed? In der SDK-Doku/MSDN lese ich, dass eine Instanz der WaitForChangedResult-Klasse erstellt werden muss; wo ist die bei Dir?

In der SDK-Doku/MSDN gibt es auch (fast immer) die von Dir gewünschten Beispiele.

Jürgen

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
public static void watcher_changed(object source, FileSystemEventArgs e)
    {
           MessageBox.Show("test", e.FullPath);
    }
       
         WaitForChangedResult result =
                                     watcher.WaitForChanged(WatcherChangeTypes.Created);



Das habe ich soweit auch, leider noch keine Erfolg...


Kha - Mo 02.03.09 21:57

user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:
In der SDK-Doku/MSDN lese ich, dass eine Instanz der WaitForChangedResult-Klasse erstellt werden muss; wo ist die bei Dir?
WaitForChanged ist synchron, aber es geht ja wahrscheinlich um asynchrone Verarbeitung.

@user profile iconmasterZed: EnableRaisingEvents hast du aber schon gesetzt? Und was hat deine Datei im System32-Ordner zu suchen :gruebel: ?


masterZed - Mo 02.03.09 22:09

denke schon....

C#-Quelltext
1:
watcher.EnableRaisingEvents = true;