Autor |
Beitrag |
ChrisxX
      
Beiträge: 19
|
Verfasst: Fr 30.01.09 14:24
Hi
Ich wollte eine Textbox auf den Inhalt überprüfen und je nachdem ewas machen.
Jedoch bekomme ich es nicht hin, ob der Text leer ist.
Mit string.IsNullOrEmpty frage ich ab ob der wert richtextbox.text leer ist. Bekomme aber nicht das richtige Ergebniss.
auch richtextbox.text != "" oder != Null klappt nicht wie ich es dachte.
Geht das überhaupt so?
|
|
danielf
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: Fr 30.01.09 14:35
|
|
ChrisxX 
      
Beiträge: 19
|
Verfasst: Fr 30.01.09 14:52
C#-Quelltext 1: 2: 3: 4: 5:
| if (string.IsNullOrEmpty(this.richTextBox2.Text)) { this.button9.ForeColor = Color.Red; } |
Nun tritt genau der Fall ein den ich nicht haben wollte  Der Text vom Button9 ist nun immer rot. Er soll aber nur Rot sein, wenn richTextBox2 etwas drinn steht.
|
|
bakachan
      
Beiträge: 503
Erhaltene Danke: 34
W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
|
Verfasst: Fr 30.01.09 15:03
Dann pack das ganze in den TextChanged-Event von der RichTextBox
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Fr 30.01.09 15:29
C#-Quelltext 1: 2: 3: 4: 5: 6:
| if ( ! string.IsNullOrEmpty(richTextBox2.Text)) { button9.ForeColor = Color.Red; } |
Und außerdem ist es vermutlich sinnvoll, im else-Zweig die Standardfarbe zu setzen.
Auf "this" kann fast immer verzichtet werden.
Gruß Jürgen
|
|
ChrisxX 
      
Beiträge: 19
|
Verfasst: Fr 30.01.09 17:16
Vielen Dank schonmal für die Antworten.
Nur leider gehts immer noch nicht. Bleibt alles schwarz, auch bei den Datensätzen die nicht leer sind.
hier der aktuelle Teil:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| private void SubForm_Load(object sender, EventArgs e) {
if (!string.IsNullOrEmpty(richTextBox2.Text)) { button9.ForeColor = Color.Red; } else { button9.ForeColor = Color.Black; } |
würde übrigens auch kürzer gehen
C#-Quelltext 1: 2: 3: 4: 5: 6:
| private void SubForm_Load(object sender, EventArgs e) {
if (!string.IsNullOrEmpty(richTextBox2.Text)) button9.ForeColor = Color.Red; else button9.ForeColor = Color.Black; |
|
|
bakachan
      
Beiträge: 503
Erhaltene Danke: 34
W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
|
Verfasst: Fr 30.01.09 17:21
Wie ich vorhin schon gesagt habe :
pack das alles in den TextChanged-Event von der RichTextBox
dann würde es jedes mal anpassen wenn sich der text darin geändert wird
|
|
ChrisxX 
      
Beiträge: 19
|
Verfasst: Fr 30.01.09 17:31
bakachan hat folgendes geschrieben : | Wie ich vorhin schon gesagt habe :
pack das alles in den TextChanged-Event von der RichTextBox
dann würde es jedes mal anpassen wenn sich der text darin geändert wird |
Dann wird es aber nicht geändert wenn ich den Subform nur lade, nichts ändere, aber in er RichTextBox schon was drinn steht.
|
|
bakachan
      
Beiträge: 503
Erhaltene Danke: 34
W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
|
Verfasst: Fr 30.01.09 17:40
Ok dann machs so:
Du machst dir eine Funktion "ColorizeButton()"
und rufst diese einfach beim laden des Forms und im TextChanged der Richtextbox auf.
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Fr 30.01.09 17:47
|
|
ChrisxX 
      
Beiträge: 19
|
Verfasst: Fr 30.01.09 17:59
thx, läuft bestens. Hab nicht daran gedacht das das Shubform ja nur einmal geladen wird. Egal durch wieviel Datensätze ich durchgehe.
@JüTho
ja ist mir klar, aber ich meinte nur kürzer in der Ansicht. thx dennoch
|
|
ChrisxX 
      
Beiträge: 19
|
Verfasst: Mi 04.02.09 12:52
Also bestens laufen ist leider übertrieben. Es läuft zwar aber nicht so wie ich es will... leider
Also nochmal was ich will:
Ich mächte das ein Button die Farbe ändert und aktiviert wird, sobald in einem Datensatz im Feld Memo etwas drinn steht.
Steht in dem Feld nichts drinn, dann soll der Button schwarz bleiben und deaktiviert werden.
Dazu muss ich volgendes sagen.
Ich habe eine Subform, worin ein Reitermenü waagerecht oben drinn ist. Insgesammt 7 Reiter. In Reiter Nummer 4 steckt das Memo Feld.
Das Programm läd alle entsprechenden Datensätze ein, und mit weiter und zurück Buttons kann man die durchgehen. Sowie einen neuen Datensatz anlegen und speichern.
Das Problem dabei: ich habe den Code ja nun einmal drinn im load des Subforms und im change des Memo Feldes.
aber es wird ja nur einmal am Anfang das Subform geladen, nicht jedesmal bei dem nächsten Datensatz neu. Auch beim change des Memo Feldes wird das doch nur abgeprüft wenn ich da per Hand was im Feld ändere oder nicht?
Momentan passiert folgendes: Programm geht auf, ich gehe die Datensätze durch (auch die wo in Memo was drinn steht) und alle Buttons sind schwarz und aktiviert. Erst wenn ich den Reiter Memo anklicke, egal bei welchem Datensatz, dann ändert er den Button richtig bei den entsprechnenden Datensätzen.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| private void SubForm_Load(object sender, EventArgs e) { if (!string.IsNullOrEmpty(richTextBox2.Text)) btnMemo.ForeColor = Color.Red; else btnMemo.ForeColor = Color.Black; }
private void richTextBox2_TextChanged(object sender, EventArgs e) { if (!string.IsNullOrEmpty(richTextBox2.Text)) { this.btnMemo.Enabled = true; btnMemo.ForeColor = Color.Red; } else { this.btnMemo.Enabled = false; btnMemo.ForeColor = Color.Black; } }
private void button9_Click(object sender, EventArgs e) { if (!string.IsNullOrEmpty(richTextBox2.Text)) { TabControl.SelectedTab = tabPage5; this.richTextBox2.Focus(); this.btnMemo.Enabled = true; } else { this.btnMemo.Enabled = false; } } |
Gibt es nicht die möglichkeit direkt die Daten zu vergleichen wenn ein Datensatz in das Feld Memo geschrieben wird? z.b. sowas wie ein Valueload oder ValueChanged?
oder kann man den Value einfach im Dataset abfragen?
Zuletzt bearbeitet von ChrisxX am Mi 04.02.09 13:58, insgesamt 1-mal bearbeitet
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Mi 04.02.09 13:53
Hallo Chris,
wenn Du die richtigen Informationen und Versuche angibst, kommt man wohl schneller zum Ziel. Du hast eigentlich von einer TextBox gesprochen und mit FormLoad und TextChanged gearbeitet, bist aber erst sehr spät damit herausgerückt, dass es sich um Datensätze handelt.
Selbstverständlich gibt es dazu passende Ereignisse. Allerdings ist eine DataTable eine (im Prinzip) ungeordnete Datenmenge, deshalb gibt es kein Ereignis wie "Zeile wurde geändert". Du kannst aber eine BindingSource zwischen die DataTable und die Controls setzen und dann das BindingSource.PositionChanged-Ereignis benutzen.
Hinweis: BindingSource.Current muss noch konvertiert werden, vermutlich in DataRow; dann kann der Wert der betreffenden Spalte abgefragt werden.
Gruß Jürgen
|
|
ChrisxX 
      
Beiträge: 19
|
Verfasst: Mi 04.02.09 14:40
Hallo Jütho
Vielen Dank erstmal für den Tipp, und sorry das ich mich am Anfang nicht ganz klar ausgedrückt habe.
ich habe mir nun ein
C#-Quelltext 1: 2: 3: 4:
| private void hauptdatensatzBindingSource_PositionChanged(object sender, EventArgs e) { } |
erstellt. Mir ist nur noch nicht ganz klar wie ich nun auf das Feld zugreifen und dann abfragen kann.
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Mi 04.02.09 15:15
Was glaubst Du denn, warum ich dies hinzugefügt habe:
JüTho hat folgendes geschrieben : | Hinweis: BindingSource.Current muss noch konvertiert werden, vermutlich in DataRow; dann kann der Wert der betreffenden Spalte abgefragt werden. |
Das genügt als Antwort noch nicht, zeigt aber doch wohl den Weg auf.  Jürgen
|
|
ChrisxX 
      
Beiträge: 19
|
Verfasst: Mi 04.02.09 17:09
nagut, ich hab mal etwas probiert, und sowas ist bei rausgekommen.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| private void hauptdatensatzBindingSource_PositionChanged(object sender, EventArgs e) { DataRow row; string str;
row = (this.hauptdatensatzBindingSource.Current as DataRowView).Row; if (row==null) { str = ""; } else { str = row["Memo"].ToString(); }
if (!string.IsNullOrEmpty(str)) { this.btnMemo.Enabled = true; this.btnMemo.ForeColor = Color.Red; } else { this.btnMemo.Enabled = false; this.btnMemo.ForeColor = Color.Black; } }
private void btnMemo_Click(object sender, EventArgs e) { this.TabControl.SelectedTab = tabPage5; this.rtbMemo.Focus(); } |
Stellt sich mir nur die Frage ob das auch kürzer geht.
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Mi 04.02.09 17:17
Na also, geht doch.
ChrisxX hat folgendes geschrieben : | Stellt sich mir nur die Frage ob das auch kürzer geht. |
Faktisch nur mit den kleinen Änderungen, die schon oben genannt wurden (mit den Operatoren '?' und '??').
Gruß Jürgen
|
|