Autor Beitrag
ChrisxX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Fr 30.01.09 14:35 
ausblenden C#-Quelltext
1:
2:
3:
4:
   if (string.IsNullOrEmpty(this.richTextBox1.Text))
   {
      MessageBox.Show("Text is null or empty");
   }

Funktioniert bei mir einwandfrei, ....

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt
ChrisxX Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Fr 30.01.09 14:52 
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
if (string.IsNullOrEmpty(this.richTextBox2.Text))
{
    //MessageBox.Show("Text is null or empty");
    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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 503
Erhaltene Danke: 34

W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
BeitragVerfasst: Fr 30.01.09 15:03 
Dann pack das ganze in den TextChanged-Event von der RichTextBox
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: Fr 30.01.09 15:29 
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
//  einfach auf "not empty" prüfen
if ( ! string.IsNullOrEmpty(richTextBox2.Text))
{
    //MessageBox.Show("Text is null or empty");
    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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: 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:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
        private void SubForm_Load(object sender, EventArgs e)
        {

            //  einfach auf "not empty" prüfen
            if (!string.IsNullOrEmpty(richTextBox2.Text))
            {
                //MessageBox.Show("Text is null or empty");
                button9.ForeColor = Color.Red;
            }
            else
            {
                button9.ForeColor = Color.Black;
            }


würde übrigens auch kürzer gehen ;)

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
        private void SubForm_Load(object sender, EventArgs e)
        {

            //  einfach auf "not empty" prüfen
            if (!string.IsNullOrEmpty(richTextBox2.Text)) button9.ForeColor = Color.Red;
            else button9.ForeColor = Color.Black;
bakachan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 503
Erhaltene Danke: 34

W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Fr 30.01.09 17:31 
user profile iconbakachan hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 503
Erhaltene Danke: 34

W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: Fr 30.01.09 17:47 
[offtopic]
user profile iconChrisxX hat folgendes geschrieben Zum zitierten Posting springen:
würde übrigens auch kürzer gehen ;)
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
private void SubForm_Load(object sender, EventArgs e)
{
    //  einfach auf "not empty" prüfen
    if (!string.IsNullOrEmpty(richTextBox2.Text)) button9.ForeColor = Color.Red;
    else button9.ForeColor = Color.Black;
}

Naja, ob die 2x2 Klammern stehen oder nicht, ist wirklich nebensächlich. Gerade wenn später Code hinzugefügt wird, ist es praktisch, wenn die Klammern schon stehen.

Wenn Du es wirklich kürzer haben willst, geht es auch so:
ausblenden C#-Quelltext
1:
2:
button9.ForeColor = string.IsNullOrEmpty(richTextBox2.Text) 
   ? Color.Black : Color.Red;

Jürgen
ChrisxX Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: 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.

ausblenden volle Höhe C#-Quelltext
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: 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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: Mi 04.02.09 15:15 
Was glaubst Du denn, warum ich dies hinzugefügt habe:
user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:
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. :roll: Jürgen
ChrisxX Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Mi 04.02.09 17:09 
nagut, ich hab mal etwas probiert, und sowas ist bei rausgekommen.

ausblenden volle Höhe C#-Quelltext
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: Mi 04.02.09 17:17 
Na also, geht doch.
user profile iconChrisxX hat folgendes geschrieben Zum zitierten Posting springen:
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