Frage von aringa12345, 56

C#: mehrere if`s für ein label?

Hi :)

noch eine letze Frage zu meinem C# Projekt (wenn man eine Picurebox klickt , soll auf einem Label eine beliebige Zahl zwischen 333 und 777 generiert werden):

ALLES funktioniert soweit außer folgendes, wenn bestimmte Zahlen generiert werden (z.B. 333, 444, 555, usw) soll auf einem Linklabel ein Link generiert werden (Google in dem Fall), bei allen anderen Zahlen einen anderen Link auf dem gleichen Label (wiki.org/Trostpreis)

Habe es schon mit mehreren if`s versucht, aber dann wird gar kein Link mehr generiert... also so:

        if (label1.Text == "333")
        {
            linkLabel1.Text = "<a href="http://www.google.com">http://www.google.com</a>";
        }
        if (label1.Text == "444")
        {
            linkLabel1.Text = "<a href="http://www.google.com">http://www.google.com</a>";
        }
        if (label1.Text == "555")
        {
            linkLabel1.Text = "<a href="http://www.google.com;">http://www.google.com;</a>
        }

        else
        {
            linkLabel1.Text = "<a href="https://de.wikipedia.org/wiki/Trostpreis">https://de.wikipedia.org/wiki/Trostpreis</a>";
        }

Aber das hat nicht geklappt. Auch das nicht

        if (label1.Text == "333")
        if (label1.Text == "444")
        if (label1.Text == "555")
        if (label1.Text == "666")
        {
            linkLabel1.Text = "<a href="http://www.google.com">http://www.google.com</a>";
        }
        
        else
        {
            linkLabel1.Text = "<a href="https://de.wikipedia.org/wiki/Trostpreis">https://de.wikipedia.org/wiki/Trostpreis</a>";
        }

UND HIER DER BISHERIGE CODE (nur relevante Methode)

    private void pictureBox1_Click(object sender, EventArgs e)
    {
        //zufällige Nummernvergabe
        String[] strLabel =
        {
        };
        Random r = new Random();
        int iSelect = r.Next(333, 777);
        label1.Text = label1.Text = r.Next(333, 777).ToString("000");


        //Gewinnausschüttung
        if (label1.Text == "333") //mehrere Zaheln!!!!!!!!!
        {
            linkLabel1.Text = "<a href="http://www.google.com">http://www.google.com</a>";
        }
        else
        {
            linkLabel1.Text = "<a href="https://de.wikipedia.org/wiki/Trostpreis">https://de.wikipedia.org/wiki/Trostpreis</a>";
        }
   }

Habt ihr eine Idee? Sry, kenne mich nicht so gut aus :/

Antwort
von Suboptimierer, 46

Bekommst du keinen Syntaxfehler?

linkLabel1.Text = "<a href="htt...

Hier müsste das Programm schon streiken, denn das zweite " beendet den String. Du müsstest dort ein \ voran stellen, um das " zu entwerten.

Kommentar von aringa12345 ,

Das hat es nur beim überkopieren irgendwie dazugebastelt(wahrscheinlich der Codeeditor von gf.net). Im Visual Studio heißt es:


linkLabel1.Text = "https://........de"


es geht alles am Code... (also der ganz untere in der Frage)

Antwort
von PWolff, 11
linkLabel1.Links.Clear();
linkLabel1.Links.Add(new System.Windows.Forms.LinkLabel.Link("https://de.wikipedia.org/wiki/Trostpreis");

Die Text-Eigenschaft eines LinkLabels hat dieselbe Bedeutung wie die eines normalen Labels - dieser Text wird nur angezeigt, weiter nichts.

Zu den ifs: Kennst du schon switch-case? Und/oder dictionaries? Damit ließe sich der Code kompakter gestalten.

Kommentar von aringa12345 ,

zu den ifs: Kennst du schon switch-case? Und/oder dictionaries?

Leider Nein...

Kommentar von PWolff ,
 if (label1.Text == "333")
{
linkLabel1.Text =http://www.google.com.google.com">http://www.google.com</a>";
}
if (label1.Text == "444")
{
linkLabel1.Text =http://www.google.com.google.com">http://www.google.com</a>";
}
if (label1.Text == "555")
{
linkLabel1.Text =http://www.google.com;google.com;">http://www.google.com;</a>
}

else
{
linkLabel1.Text =https://de.wikipedia.org/wiki/Trostpreis/Trostpreis">https://de.wikipedia.org/wiki/Trostpreis</a>";
}

funktioniert so nur, wenn du else if verwendest:

 if (label1.Text == "333")
{
linkLabel1.Text =http://www.google.com.google.com">http://www.google.com</a>";
}
else if (label1.Text == "444")
{
linkLabel1.Text =http://www.google.com.google.com">http://www.google.com</a>";
}
else if (label1.Text == "555")
{
linkLabel1.Text =http://www.google.com;google.com;">http://www.google.com;</a>
}
else
{
linkLabel1.Text =https://de.wikipedia.org/wiki/Trostpreis/Trostpreis">https://de.wikipedia.org/wiki/Trostpreis</a>";
}

und lässt sich gleichbedeutend durch einen switch-Block darstellen (das macht man üblicherweise bei mehreren else if, die denselben Ausdruck mit anderen vergleichen - hier label1.Text):

 switch (label1.Text) {
case "333": // label1.Text == "333"
linkLabel1.Texthttp://www.google.comww.google.com">http://www.google.com</a>";
break;
case "444":
linkLabel1.Texthttp://www.google.comww.google.com">http://www.google.com</a>";
break;
case "555":
linkLabel1.Texthttp://www.google.com;w.google.com;">http://www.google.com;</a>
break;
default: // else
linkLabel1.Texthttps://de.wikipedia.org/wiki/Trostpreiski/Trostpreis">https://de.wikipedia.org/wiki/Trostpreis</a>";
break; // C# will das so haben, obwohl es überflüssig ist
};

Vergiss die break-Anweisungen nicht, sonst macht C# kommentarlos mit den Anweisungen hinter dem nächsten Case weiter.

Man kann auch mehrere case zusammenfassen:

 switch (label1.Text) {
case "333": // label1.Text == "333"
case "444": // || label1.Text == "444"
case "555": // || label1.Text == "555"
linkLabel1.Texthttp://www.google.com;w.google.com;">http://www.google.com;</a>
break;
default: // else
linkLabel1.Texthttps://de.wikipedia.org/wiki/Trostpreiski/Trostpreis">https://de.wikipedia.org/wiki/Trostpreis</a>";
break; // C# will das so haben, obwohl es überflüssig ist
};

Beachte, dass hier KEINE break-Anweisungen hinter den ersten case stehen.

Mit Dictionary kannst du die Umsetzungen von Label-Inhalt und Link-Ziel an einer Stelle am Anfang des Quellcodes zusammenfassen:

   private Dictionary<string, string> linkDict = new Dictionary<string, string>();

private void Form1_Load(object sender, EventArgs e) {
// ...

linkDict.Add("33http://google.come.com");
linkDict.Add("44http://google.come.com");
// etc.
linkDict.Add(http://trostpreis.example.come.com");

// ...

und dann folgendermaßen ersetzen:

    linkLabel1.Links.Clear();
    if (linkDict.ContainsKey(label1.Text)) {
      linkLabel1.Links.Add(linkDict.Item(label1.Text));
    } else {
      linkLabel1.Links.Add(linkDict.Item(""));
    };

ich hab oben die Zuweisungen zu linkLabel1.Text nicht geändert, hier geht es ja um if .. else if ... else und switch ... case.

(Im Nachhinein denke ich, ich hätte dir das Dictionary nicht zeigen sollen - das ist eher was für Fortgeschrittene)

Kommentar von PWolff ,

Und jetzt fällt mir auf, dass gutefrage.net mit spitzen Klammern in Eingabefeldern nicht richtig klarkommt.

Das hätte mir eigentlich schon bei Dictionary&lt;string, string&gt; aufgefallen sein müssen.

Antwort
von Unsinkable2, 3

Es gibt eine Vielzahl an Lösungen für dein Problem: 

Koppelung von Vergleichen: Damit kannst du in einer "if"-Abfrage mehrere Vergleiche anstellen: "Wenn a ODER b ODER c ODER d ODER e .... dann ... ansonsten". 

Dabei sind die zwei senkrechten Striche || das Zeichen für "oder". Wie viele "oder" du abfragen willst, liegt ganz allein bei dir und deiner Aufgabe. Ich mache es beispielhaft mit zwei 

if (label1.Text == "333" || label1.Text == "444")
{
   linkLabel1.Text = "<a href=\"http://www.google.com\">Google</a>";
} 
else
{
   linkLabel1.Text = "<a href=\"http://de.wikipedia.org/wiki/Trostpreis\">Trostpreis</a>";
}

--------------------------------------------

Alternativ legst du dir eine "Zahlenliste" an:

Das ist pflegeleichter, wenn du diese Liste auch an anderen Stellen brauchen kannst (ich meine, mich zu erinnern, dass du nach sowas an anderer Stelle gefragt hattest).

List<string> zahlenListe = new List<string>() { "111", "222", "333", "444", "555", "666", "777", "888", "999" };

Und dann vergleichst du auf den Inhalt der Liste:

if (zahlenListe.Contains(label1.Text) == true)
{
   linkLabel1.Text = "<a href=\"http://www.google.com\">Google</a>";
}
else
{
   linkLabel1.Text = "<a href=\"http://de.wikipedia.org/wiki/Trostpreis\">Trostpreis</a>";
}

---------------------------------------------

Vereinfachung:

Da du ein Muster in deinen Zahlen hast, kannst du das zu Vereinfachungszwecken nutzen:

int minValue = 1;
int maxValue = 9; bool found = false;

for (int i = minValue; i <= maxValue; i++)
{
    if ( Int32.Parse(label1.Text) == (i * 111) )
    {
        linkLabel1.Text = "<a href=\"http://www.google.com\">Google</a>"; found = true; break;
    }
} if (found == false) { linkLabel1.Text = "<a href=\"http://de.wikipedia.org/wiki/Trostpreis\">Trostpreis</a>"; }

Mit dieser "for"-Schleife fragen wir alle Werte von 111 - 999 (also 111, 222, 333, 444, 555, 666, 777, 888, 999) ab. 

Sollte einer davon in label1.Text stehen, wird der "if"-Teil ausgeführt und die Schleife abgebrochen. Enthält hingegen label1.Text keine der Zahlen, dann wird das zweite "if" (found == false) ausgeführt.

Diese Variante hat den Vorteil, dass du sehr kompakten Code erzeugst, der sich leicht pflegen lässt.

---------------------------------------------------

... Es gibt noch viele weitere Varianten, einige davon hat man dir hier ja schon vorgeschlagen. 

Letztlich ist nicht wichtig, welche Variante du nimmst. Wichtig ist, dass du die Variante, die du nimmst, wirklich verstehst. Denn wenn Fehler in deinem Programm auftreten, macht es die Sache ein ganzes Stück einfacher, wenn du den Fehler auch finden kannst... 

Antwort
von triopasi, 27

Du meinst mehrere Bedingunen für einen Block, richtig?

if(a == 111 || a == 222 || a == 333)
{
// do something
}

|| ist ein ODER; && ein UND. Du kannst diese Operatoren auch kombinieren, z.b.

(a == 1 && b == 1) || a == 2
Kommentar von aringa12345 ,

Ja genau   vielen Dank, dieses Konzept haben wir noch nicht gelernt :)))

Kommentar von triopasi ,

alternativ kannst du auch switch verwenden, das geht folgendermaßen, vllt. hattet ihr das ja schon:


swtich(a)
{
case 111:
case 222:
case 333:
// do something
break;
case 444:
// something else
break;
}
Kommentar von ceevee ,

Korrekt für die Fragestellung wäre es eher:

switch(label1.Text) {

case "333":

case "444":

case "555":

// google-Link

break;

default:

// wiki-Link

}

Kommentar von triopasi ,

so genau hatte ich die frage nicht im kopf xD

Kommentar von aringa12345 ,

Hey ich bins nochmal, hat supi geklappt aber was mache ich jetzt?


(ich weiß ist echt sche iße gelöst aber was solls)

die zwei ifs hebeln sich gegenseitig aus :(


(PS: Der gf.net editor stellt die links wieder so komisch dar, einfach ignorieren :P, bzw jz scheint es richtig angezeigt zu werden. Egal. Geht ja um die ifs)


if (label1.Text == "333" || label1.Text == "444" || label1.Text == "555" || label1.Text == "666" || label1.Text == "777" || label1.Text == "345" || label1.Text == "456" || label1.Text == "737" || label1.Text == "747" || label1.Text == "757" || label1.Text == "767" || label1.Text == "636" || label1.Text == "646" || label1.Text == "656" || label1.Text == "676" || label1.Text == "535" || label1.Text == "545" || label1.Text == "565" || label1.Text == "575" || label1.Text == "434" || label1.Text == "454" || label1.Text == "464" || label1.Text == "474" || label1.Text == "343" || label1.Text == "353" || label1.Text == "363" || label1.Text == "373")
{
linkLabel1.Text = "http://www.google.de;
}

if (label1.Text == "331" || label1.Text == "332" || label1.Text == "334" || label1.Text == "335" || label1.Text == "336" || label1.Text == "337" || label1.Text == "338" || label1.Text == "339" || label1.Text == "441" || label1.Text == "442" || label1.Text == "443" || label1.Text == "445" || label1.Text == "445" || label1.Text == "447" || label1.Text == "448" || label1.Text == "449" || label1.Text == "551" || label1.Text == "552" || label1.Text == "553" || label1.Text == "554" || label1.Text == "556" || label1.Text == "557" || label1.Text == "558" || label1.Text == "559" || label1.Text == "661" || label1.Text == "662" || label1.Text == "663" || label1.Text == "664" || label1.Text == "665" || label1.Text == "667" || label1.Text == "668" || label1.Text == "669" || label1.Text == "771" || label1.Text == "772" || label1.Text == "773" || label1.Text == "774" || label1.Text == "775" || label1.Text == "776" || label1.Text == "778" || label1.Text == "779" || label1.Text == "433" || label1.Text == "533" || label1.Text == "633" || label1.Text == "733" || label1.Text == "344" || label1.Text == "544" || label1.Text == "644" || label1.Text == "744" || label1.Text == "355" || label1.Text == "455" || label1.Text == "655" || label1.Text == "755" || label1.Text == "366" || label1.Text == "466" || label1.Text == "566" || label1.Text == "766" || label1.Text == "377" || label1.Text == "477" || label1.Text == "577" || label1.Text == "677" || label1.Text == "300" || label1.Text == "400" || label1.Text == "500" || label1.Text == "600" || label1.Text == "700")
{
linkLabel1.Text = "http://sanger.dk";
}

else
{
linkLabel1.Text = "https://de.wikipedia.org/wiki/Trostpreis";
}
Antwort
von ceevee, 18

Für die Fragestellung würde ich allgemein überhaupt kein if/else, sondern einen switch nehmen. Davon mal abgesehen: dein zweiter Code ist völliger Quatsch, gehen wir mal durch, was der erste macht:

text == "333"? Ja? Google-Link. Nein? Weiter

text == "444"? Ja? Google-Link. Nein? Weiter

text == "555"? Ja? Google-Link. Nein? Weiter

else -> text lautet also nicht "555" - die beiden if-Anfragen darüber interessieren nicht, was ggf. vorher im Textfeld steht, wird überschrieben. Will heißen: wenn der Text nicht "555" ist, dann wird der wiki-Link generiert - egal, ob der Text "333" oder "444" oder sonstwie lautet. Wenn du bei if-else bleiben willst, dann musst du das else immer weitertragen, also

 if (label1.Text == "333")
{
linkLabel1.Text =http://www.google.com.google.com">http://www.google.com</a>";
}
else if (label1.Text == "444")
{
linkLabel1.Text =http://www.google.com.google.com">http://www.google.com</a>";
}
else if (label1.Text == "555")
{
linkLabel1.Text =http://www.google.com;google.com;">http://www.google.com;</a>
}

else
{
linkLabel1.Text =https://de.wikipedia.org/wiki/Trostpreis/Trostpreis">https://de.wikipedia.org/wiki/Trostpreis</a>";
}
Antwort
von Omnivore11, 5

Ist ja auch logisch, weil das else NUR für das letzte if greift. Du solltest EINE If nehmen und das logisch "oder" verknüfen. Oder du benutzt else if's. So jedenfalls ist es logisch, dass es nicht geht.

PS: vor den Strings bitte ein '@' voranstellen um die Escapesequenzen explizit zu missachten


Antwort
von daCypher, 33

Ich kenne mich mit C# leider nicht aus, aber ich hab eine Sache gefunden, die so nicht funktionieren kann und eine zusätzliche Idee.

1. Die Zeilen mit dem Link können so nicht funktionieren:

linkLabel1.Text = "<a href="http://www.google.com">http://www.google.com</a>"
                  ^        ^                     ^                          ^
                  |        |                     |                          Hier ist er wirklich zu Ende
                  |        |                     Hier fängt er wieder an
                  |        Hier hört er auf
                  Hier fängt der String an

Soweit ich weiß, werden Anführungszeichen, die im String sein sollen als doppelte Anführungszeichen reingeschrieben. Also z.B.

linkLabel1.Text = "<a href=""http://www.google.com"">http://www.google.com</a>"


Probier es mal damit.


2. Idee: Vielleicht linkLabel1.Text auch nicht die richtige Eigenschaft und es gibt vielleicht sowas, wie linkLabel1.Link. Da musst du aber selbst mal nachschauen.

Kommentar von aringa12345 ,

Danke :)

Das komische mit a href hat es iwie beim rüberkopieren dazugemacht. KP warum

linkLabel1.Text = "https://........de"

soll es eigentlich heißen :)

Kommentar von daCypher ,

Achso. Das heißt auf dem Label steht zwar der richtige Text, aber es passiert nichts, wenn du draufklickst?

Schau mal, ob es z.B. linkLabel1.Hyperlink oder linkLabel1.onClick gibt.

Kommentar von aringa12345 ,

es gibt nen hyperlink aber es passiert nichts bein klicken :o

Keine passende Antwort gefunden?

Fragen Sie die Community