none
3 verschiedene Fragen RRS feed

  • Frage

  • Hallo,

    ich hoffe, das es erlaubt ist, mehrere verschiedene Fragen in einem Thread zu stellen. Wenn nicht, bitte anmerken.

    1. Frage: Ich generiere im Programm dynamische Buttons. Wenn die Buttons generiert werden, wird als Texteigenschaft eine Zahlenkombination eingetragen, die ich vorher definiere. Diese Zahlenkombination existiert dann auch als Textdatei. Funktioniert alles einwandfrei. Nun möchte ich aber, das beim klick auf den Button genau diese Datei automatisch geöffnet wird. Die Schwierigkeit ist aber, das ich die Datei nicht auswählen will. Die Daten in den einzelnen Zeilen sollen auch nicht in einem Texteditor geöffnet werden, sondern in verschiedenen Textboxen im Programm geschrieben werden.

    2. Frage: Ich erstelle in diesem Programm eine Textdatei mit einer unterschiedlichen Anzahl an Zeilen. Wie kann ich die Textdatei von beispielsweise Zeile 18 bis Ende einlesen und in eine Richtextbox schreiben?

    3. Frage: In dieser Textdatei werden auch die Werte von Checkboxen mit den Werten "true" und "false" abgespeichert. Diese Werte werden immer in der gleichen Zeile abgelegt. Wenn ich nun diese Werte wieder einlesen will und die Checkboxen ansteuern will, gibt das Programm mir eine Fehlermeldung "eine Konvertierung von string in bool ist nicht möglich". Wie kann ich das denn sonst abfragen?

    Vielen Dank für eure Hile

    Montag, 12. Mai 2014 10:41

Antworten

  • Hallo,

    noch eine kleine Idee zu 1.:
    Die Tag-Eigenschaft der Buttons kannst du mit einem benutzerdefinierten Objekt belegen. Beispielsweise mit einem Verweis auf die TextBoxen:

    button1.Tag = textBox1;
    button2.Tag = textBox2;
    button3.Tag = textBox3;

    Dadurch können dann alle Buttons den selben Eventhandler für Click bekommen:

    private void button_Click(object sender, EventArgs e)
    {
        var btn = sender as Button;//Button auslesen
        var tb = btn.Tag as TextBox;//TextBox aus Button auslesen
        tb.Text = System.IO.File.ReadAllText(btn.Text);//Text einlesen
    }

    Je nachdem, wie viele Buttons/Textboxen du hast, lohnt sich dieser Weg.

    Nun zu den anderen Fragen:

    zu 2.)
    Da gibt es verschiedene Wege. Auswahlsweise 2:

    //Möglichkeit 1 mit LINQ:
    richTextBox1.Lines = System.IO.File.ReadLines("Dateipfad").Skip(19).ToArray();//Alle Zeilen lesen, die ersten 18 überspringen, in ein Array wandeln und ausgeben
    
    //Möglichkeit 2: mit Schleife:
    using (var sr = new StreamReader(@"Dateipfad"))
    {
        int i = 0;
        while (!sr.EndOfStream)//Dateiende erreicht?
        {
            if (i >= 18)//Nach Zeile 18?
            {
                richTextBox1.AppendText(sr.ReadLine());//Zeile asu Datei lesen
                richTextBox1.AppendText(Environment.NewLine);//Neue Zeile einfügen
            }
            else
            {
                sr.ReadLine();//Zeile lesen um diese zu überspringen
                ++i;//Zeilennummer erhöhen
            }
        }
    }
    zu 3.)
    du hast sicherlich den Text "true" und "false" in der Datei stehen. Diese kannst du mit bool.Parse in einen bool-Wert umsetzen:
    checkBox1.Checked = bool.Parse("true");
    Mit bool.TryParse könntestdu noch abfragen, ob der String überhaupt ein gültiger Wert ist.


    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Montag, 12. Mai 2014 13:24
    Moderator

Alle Antworten

  • Hi,

    generell ist es sowohl für dich als auch die Antwortenden sinnvoller, jede Frage in einem eigenen Thread zu posten, das es die Übersichtlichkeit erhöht und es evtl. auch Leute gibt, die zwar eine der Fragen, nicht aber die anderen beantworten können. Andere Leser denken dann evtl., dass schon alles beantwortet ist und lesen nicht mehr weiter, ...

    Aber schaun wir mal :)

    Zu 1. Wenn Du den Namen der Textdatei irgendwo stehen hast, kannst Du diese Angabe auch verwenden, um die Datei zu öffnen bzw. auszulesen.

    private void Button1_Click( ... )
    {
        textBox1.Text = this.ReadFile( Button1.Text );
    }
    
    private void Button2_Click( ... )
    {
        textBox2.Text = this.ReadFile( Button2.Text );
    }
    
    public String ReadFile( String FileName )
    {
        return System.IO.File.ReadAllText( FileName );
    }
    
    (Geht auch effizienter, so ist es aber evtl. besser ersichtlich, wie es grundlegend geht)

    Antworten auf die anderen Fragen muss ich später machen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Montag, 12. Mai 2014 11:12
    Moderator
  • Hallo,

    noch eine kleine Idee zu 1.:
    Die Tag-Eigenschaft der Buttons kannst du mit einem benutzerdefinierten Objekt belegen. Beispielsweise mit einem Verweis auf die TextBoxen:

    button1.Tag = textBox1;
    button2.Tag = textBox2;
    button3.Tag = textBox3;

    Dadurch können dann alle Buttons den selben Eventhandler für Click bekommen:

    private void button_Click(object sender, EventArgs e)
    {
        var btn = sender as Button;//Button auslesen
        var tb = btn.Tag as TextBox;//TextBox aus Button auslesen
        tb.Text = System.IO.File.ReadAllText(btn.Text);//Text einlesen
    }

    Je nachdem, wie viele Buttons/Textboxen du hast, lohnt sich dieser Weg.

    Nun zu den anderen Fragen:

    zu 2.)
    Da gibt es verschiedene Wege. Auswahlsweise 2:

    //Möglichkeit 1 mit LINQ:
    richTextBox1.Lines = System.IO.File.ReadLines("Dateipfad").Skip(19).ToArray();//Alle Zeilen lesen, die ersten 18 überspringen, in ein Array wandeln und ausgeben
    
    //Möglichkeit 2: mit Schleife:
    using (var sr = new StreamReader(@"Dateipfad"))
    {
        int i = 0;
        while (!sr.EndOfStream)//Dateiende erreicht?
        {
            if (i >= 18)//Nach Zeile 18?
            {
                richTextBox1.AppendText(sr.ReadLine());//Zeile asu Datei lesen
                richTextBox1.AppendText(Environment.NewLine);//Neue Zeile einfügen
            }
            else
            {
                sr.ReadLine();//Zeile lesen um diese zu überspringen
                ++i;//Zeilennummer erhöhen
            }
        }
    }
    zu 3.)
    du hast sicherlich den Text "true" und "false" in der Datei stehen. Diese kannst du mit bool.Parse in einen bool-Wert umsetzen:
    checkBox1.Checked = bool.Parse("true");
    Mit bool.TryParse könntestdu noch abfragen, ob der String überhaupt ein gültiger Wert ist.


    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Montag, 12. Mai 2014 13:24
    Moderator
  • Hallo,

    schon mal vielen Dank für die Antworten.

    zu 1: Ich weiß nicht, ob ich mich verständlich ausgedrückt habe. Die Buttons sind dynamisch generiert. Das heißt, dass sie bei der Programmentwicklung noch gar nicht existieren. Somit kann ich den Buttons doch keine Namen zu ordnen.

    zu 2: Funktioniert leider nicht, da ich bei Dateipfad kein Pfad eingeben kann. Es handelt sich ja immer um eine andere Datei

    zu 3: hat funktioniert. Super, danke

    Montag, 12. Mai 2014 14:59
  • zu 1.)
    Für Stefans code brauchst du natürlich Hard kodierte Control (per Designer erzeugt). Um es ohne Namen zum laufen zu bekommen ist es schwieriger.
    Für meinen Code brauchst du allerdings keine Variablen. Beim Erzeugen der Buttons weißt du einfach die Tag-Eigenschaften die TextBoxen zu. Der Click-Eventhandler ist davon vollkommen unabhängig.

    zu 2.)
    Ohne Pfad keine Datei. Du musst irgendwie einen Pfad angeben, sonst kann es nicht funktionieren. Ich kenne deine Anforderungen nicht, wenn die Datei aber direkt bei der Anwendung liegt, kannst du einen relativen Pfad der Form "Dateiname.txt" angeben. Für alles andere muss de absolute Pfad verwendet werden ("C:\Ordner\...\Dateiname.txt").
    Du kannst den Dateinamen natürlich auch aus der Pfadangabe und dem Dateinamen zusammen bauen:

    string path = "C:\..." + fileName;


    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Montag, 12. Mai 2014 15:13
    Moderator
  • Super. Problem 2 funzt nun auch. Habe es übers Array geschafft.

    Aber für Problem 1 bin ich einfach zu blöd. Vielleicht hilft es, wenn ich noch ein wenig aushole:

    - Ich habe eine Mainform mit 15 Textboxen und 4 Checkboxen

    - Beim klick auf den Button "neues Gerät" erscheint eine neue Form mit 15 Textboxen und 4 Checkboxen für die Eigenschaften des Gerätes.

    - Diese werden ausgefüllt und beim klick auf den Button "Speichern", wird eine Textdatei mit der Seriennummer des Gerätes, die in einer Textbox steht, erzeugt.

    - Das Formblatt wird geschlossen und in der Main wird ein Button mit der Texteigenschaft der Seriennummer erzeugt.

    Bis dahin funzt alles

    - klickt man nun auf diesen Button, öffnet sich im Hintergrund diese Datei.

    - Der Inhalt soll nun in die 15 Textboxen in der Main geschrieben werden. Mit einem Button geht es vielleicht noch, da man dem Programm sagen kann "du sollst genau diese Datei öffnen", aber bei mehreren Dateien??????

    Montag, 12. Mai 2014 15:57
  • Jetzt war das ganze scho verständlicher ;)

    Du hast gesagt, du zeigst auf dem dynamischen Button den Dateipfad oder den Namen an. Um es einfacher zu machen, benutzen wir die Tag-Eigenschaft um den gesamten pfad zu speichern:

    Button b = enw Button();/Neuen Button anlegen
    b.Tag = "Dateipfad + Dateiname";
    b.Text = "Dateiname";
    b.Click + = b_Click;//Click-Event abonnieren this.Controls.Add(b);//Button anzeigen
    Nun kannst du im Click-Eventhandler den Button aus den Parametern abfragen und den Tag (den Dateinamen + Pfad) ermitteln:
    void b_Click(object sender, EventArgs e){
      var button = sender as Button;
      var lines = File.ReadAllLines(button.Tag.ToString());//Tag auslesen und die Datei Zeilenweise auslesen
      //TextBoxen befüllen, so wie du dir das gedahct hast:
      textBox1.Text = lines[0];
      textBox2.Text = lines[1];
      //usw.
    }
    Das war es eigentlich schon. Genau genommen nicht viel anders, als das was ich in meiner ersten Antwort geschrieben habe.


    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Montag, 12. Mai 2014 16:05
    Moderator
  • Sieht sehr verständlich aus. Hab ich alles so gemacht, wie du es aufgeschrieben hast. Nur leider kommt nach dem kompilieren folgende Fehlermeldung:

    Ein Ausnahmefehler des Typs "System.NullReferenceException" ist in WindowsFormsApplication1.exe aufgetreten.

    Zusätzliche Informationen: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.Diese bezieht sich auf die Zeile

    var lines = File.ReadAllLines(button.Tag.ToString());

    Was ist denn mit dem Hinweis Objektinstanz gemeint?

    Montag, 12. Mai 2014 16:19
  • Hast du auch die tag-Eigenschaft zugewiesen?

    Der Fehler meint, dass ein Objekt nicht zugewiesen wurde und ich vermute mal das das Tag ist. (button könnte natürlich auch null sein, jedoch ist sender immer von Typ Button, wenn es ein Button.Click-Eventhandler ist.)


    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Montag, 12. Mai 2014 16:23
    Moderator