Hjälp med en programmeringsuppgift c#

Permalänk
Medlem
Skrivet av PapaDiouf:

Nu har jag suttit hela kvällen och är i princip helt färdig med själva programmet, tack för all hjälp det hade inte gått utan er!
Min absolut sista fråga kring den här uppgiften är, när man klickar runt på knapparna i menyn, säg exempelvis att man väljer Play with animals, då dyker en till ruta och knappar upp för att fortsätta där, men väljer man sedan knapp nummer två i menyraden så ligger allt från playtrycken kvar, finns det något sätt att rensa upp de gamla knapptrycken när man väljer ett nytt alternativ för att det nya skall kunna ses bättre? Exempelvis någon typ av Console.Clear eller något jag kan använda för att rensa upp lite.

Nu är jag snäll, men sånt där ska du enkelt kunna googla fram. Söker du på textbox clear winforms så har du svaret direkt. Så slipper du sitta och vänta på svar i forum.

https://docs.microsoft.com/en-us/dotnet/api/system.windows.fo...

Permalänk

@zaibuf: Absolut, va lite otydligt av mig också, just att rensa textbox hittade jag, var mer att jag ville att buttons skulle försvinna när nästa knapp trycktes på, det hittade jag inget bra alternativ på men kom på en lösning dock genom att göra en ny button "Return to menu", går säkert att göra det väldigt mycket smidigare, men den gör jobbet och programmet är helt klart nu och fungerar som det skall.

private void buttonReturnToMenu_Click(object sender, EventArgs e) { buttonPlaywMisse.Visible = false; buttonPlaywZorro.Visible = false; buttonPlaywZeus.Visible = false; textBoxPlayWithMisse.Visible = false; textBoxPlayWithZorro.Visible = false; textBoxPlayWithZeus.Visible = false; LabelPlayWa.Visible = false; labelHereIsTheAnimals.Visible = false; buttonFeedMisse.Visible = false; buttonFeedZorro.Visible = false; buttonFeedZeus.Visible = false; labelFeedAnimals.Visible = false; buttonFishForMisse.Visible = false; buttonChickenForMisse.Visible = false; buttonMeatForZorro.Visible = false; buttonFishForZorro.Visible = false; buttonCandyForPuppy.Visible = false; buttonMeatForPuppy.Visible = false; labelMisseDoesNotLikeChicken.Visible = false; textBoxFeedMisse.Visible = false; textBoxFeedZorro.Visible = false; textBoxFeedPuppy.Visible = false; textBoxMisseChoiceOfFood.Visible = false; textBoxZorroChoiceOfFood.Visible = false; textBoxPuppyChoiceOfFood.Visible = false; Action<Control.ControlCollection> func = null; func = (controls) => { foreach (Control control in controls) { if (control is TextBox) { (control as TextBox).Clear(); } else { func(control.Controls); } } }; func(Controls); { buttonReturnToMenu.Visible = false; } }

Vet du någon enklare lösning jag kan ta med mig i fortsättningen får du gärna hojta till, annars bugar jag och bockar för denna gång

Permalänk
Medlem
Skrivet av PapaDiouf:

@perost: Har faktiskt inte kommit till ? operatorn än men den var ju sjukt smidig i detta fall, blir jäkligt lite kod och det passar mig som har en tendens att snurra till det med all kod! Precis den ska bara slumpa antingen eller, om Cat vill leka eller är för hungrig liksom, tack för det!

Det finns en ?? operator med. Den funkar helt annorlunda men är sjukt smidig. Den kollar om nått är null och om det är det så använder den nästa föreslagna. null kommer att bli en evig följeslagare i den objekt orienterade världen framöver.

Ex.

Object result = object1 ?? objectBackup; switch (result.type) // <--- Detta skulle annars ha crashat hårt om object1 var tomt. { ....... }

result blir här object1 om inte detta är null (dvs är tomt på innehåll) och ifall det är tomt så får det värdet av objectBackup (som då bör innehålla nått såklart) på så sätt slipper man all koll om nått är tilldelat värden osv..

Visa signatur

"Om man arbetar tillräckligt länge med att förbättra ett föremål går det sönder. "

Hjälp oss göra världen lite snällare! www.upphittat.nu

Permalänk
Medlem
Skrivet av PapaDiouf:

@zaibuf: Absolut, va lite otydligt av mig också, just att rensa textbox hittade jag, var mer att jag ville att buttons skulle försvinna när nästa knapp trycktes på, det hittade jag inget bra alternativ på men kom på en lösning dock genom att göra en ny button "Return to menu", går säkert att göra det väldigt mycket smidigare, men den gör jobbet och programmet är helt klart nu och fungerar som det skall.

private void buttonReturnToMenu_Click(object sender, EventArgs e) { buttonPlaywMisse.Visible = false; buttonPlaywZorro.Visible = false; buttonPlaywZeus.Visible = false; textBoxPlayWithMisse.Visible = false; textBoxPlayWithZorro.Visible = false; textBoxPlayWithZeus.Visible = false; LabelPlayWa.Visible = false; labelHereIsTheAnimals.Visible = false; buttonFeedMisse.Visible = false; buttonFeedZorro.Visible = false; buttonFeedZeus.Visible = false; labelFeedAnimals.Visible = false; buttonFishForMisse.Visible = false; buttonChickenForMisse.Visible = false; buttonMeatForZorro.Visible = false; buttonFishForZorro.Visible = false; buttonCandyForPuppy.Visible = false; buttonMeatForPuppy.Visible = false; labelMisseDoesNotLikeChicken.Visible = false; textBoxFeedMisse.Visible = false; textBoxFeedZorro.Visible = false; textBoxFeedPuppy.Visible = false; textBoxMisseChoiceOfFood.Visible = false; textBoxZorroChoiceOfFood.Visible = false; textBoxPuppyChoiceOfFood.Visible = false; Action<Control.ControlCollection> func = null; func = (controls) => { foreach (Control control in controls) { if (control is TextBox) { (control as TextBox).Clear(); } else { func(control.Controls); } } }; func(Controls); { buttonReturnToMenu.Visible = false; } }

Vet du någon enklare lösning jag kan ta med mig i fortsättningen får du gärna hojta till, annars bugar jag och bockar för denna gång

Lägg knapparna på en panel och göm panelen, så slipper du gömma alla knapparna en och en.

Visa signatur

"Om man arbetar tillräckligt länge med att förbättra ett föremål går det sönder. "

Hjälp oss göra världen lite snällare! www.upphittat.nu

Permalänk

@ZecretW: Åfan, vad kallar man ? och ?? operatörerna, om jag skulle säga namnet? Ska försöka att få in ?? operatören, verkar ju jäkligt smidig!

Permalänk

@ZecretW: Snyggt! Testade även den lösningen och blev ju jäkligt bra det med, tack för de!

Permalänk
Medlem
Skrivet av PapaDiouf:

@ZecretW: Åfan, vad kallar man ? och ?? operatörerna, om jag skulle säga namnet? Ska försöka att få in ?? operatören, verkar ju jäkligt smidig!

Ternary statement, fungerar som en if/else. Går att nästla ytterligare, men blir då oftast bara mer svårläst.
Statement måste vara en bool och det första värdet returerar för true och andra för false.

var color = "red"; var isTheColorRed = color == "red" ? "yes" : "no"; Console.WriteLine(isTheColorRed); // "yes" // Motsvarighet if(color == "red") { return "yes"; } else { return "no"; }

?? är en null-coalescing operator och returerar värdet till vänster om ?? om det inte är null, annars returera det värdet till höger. Det kan även vara exceptions. Ett exempel är att returera listan myStrings, om den listan är null så returera en ny lista som är tom.
Ett annat är att om värdet för en variabel är null som inte ska vara det, kasta ett exception.
Tänk dig nedanstående exempel som en return från en metod.

// Returera en ny tom lista istället om myStrings är null. return myStrings ?? new List<string>(); // Kastar ett exception om variabeln är null. Annars retureras variabeln. return shouldNotBeNull ?? throw new ArgumentNullException("shouldNotBeNull was null!");

Sedan finns det ytterligare ett tillägg till null-coalescing operatorn som är ??=. Här assignar man värdet från högra till vänstra sidan OM vänstra sidan är null. Tidigare var man tvungen att göra null checks och sedan assigna ett värde om det var null. Till skillnad från ?? som returerar antingen första eller andra så gör ??= en assignment av högra värdet till vänstra.
Exempel:

// Tidigare if(animals is null) { animals = new List<Animal>(); } // Blir då istället animals ??= new List<Animal>();

Dessa klassas som syntactic sugar, men de kan också skapa mycket mer lättläst kod om man använder de på rätt sätt. Jag skulle dock vara försiktig att använda de för mycket i ett skolarbete som (jag antar) ligger på gymnasienivå. Har ni inte gått igenom det i skolan så kan läraren bli skeptisk till din kod om den känns för avancerad för nivån ni bör ligga på.

Permalänk
Medlem
Skrivet av zaibuf:

Jag skulle dock vara försiktig att använda de för mycket i ett skolarbete som (jag antar) ligger på gymnasienivå. Har ni inte gått igenom det i skolan så kan läraren bli skeptisk till din kod om den känns för avancerad för nivån ni bör ligga på.

Hahaha,

Lärare förr;
-"Oj så bra du gjort det. Mycket mer avancerat än vi gått igenom, du visar verkligen intresse. Du får högt betyg."

Lärare nu;
-"Hmm, detta verkar väldigt avancerat, du har nog fuskat. det blir underkänt."

Visa signatur

"Om man arbetar tillräckligt länge med att förbättra ett föremål går det sönder. "

Hjälp oss göra världen lite snällare! www.upphittat.nu

Permalänk
Medlem

@ZecretW:

haha så sant, bara kopiera in koden i Google så kommer läraren hit direkt. Dock har trådskaparen sökt information och på köpet fått nya kunskaper som ligger utanför kursen.
Dock är ju frågan om han endast kopierar eller faktiskt förstår konceptet så han lär sig :).

Permalänk

@Badmondy: Jadå, tanken är att lära sig detta då jag tänker mig en framtid inom programmering, så frågar om saker jag inte förstår, med jäkligt bra repsons. Är sällan jag får svaret rakt ut och är inte heller det jag söker i första hand, men jag ser din poäng

Permalänk
Medlem

Tja! Lånar tråden lite då jag är på samma uppgift och har kört fast.
Jag lyckas inte anropa metoden Interact som finns i Cat-klassen.

Jag har försökt med cat.Interact(); likt det ni rekommenderade för TS men det går inte, står: "An object reference is required for the non-static field, method, or property 'Cat.Interact()' JOPPESHUNDARV1"

Jag har försökt med ListPets[0].Interact();
Här får jag inget felmeddelande men när jag trycker på knappen "Feed" så händer ingeting.

Min knapp

private void textBoxInput_TextChanged(object sender, EventArgs e) { string userInput = textBoxInput.Text; if (userInput == "stolle") { ListPets[0].Interact(); } else if (userInput == "alfons") { } }

Metoden jag försöker anropa

public override string Interact() { string fetch = "You are playing fetch with Stolle"; return fetch; }

Om ni skulle vilja kika på hela koden:

namespace JOPPESHUNDARV1 { public partial class Form1 : Form { private List<Animal> ListPets = new List<Animal>(); public Form1() { InitializeComponent(); ListPets.Add(new Cat("Stolle", 1)); ListPets.Add(new Dog("Alfons", 2)); ListPets.Add(new Puppy(5, "Pajas", 0)); } private void textBoxInput_TextChanged(object sender, EventArgs e) { string userInput = textBoxInput.Text; if (userInput == "stolle") { ListPets[0].Interact(); //labelInfo.Text = "You are playing with Stolle"; } else if (userInput == "alfons") { //labelInfo.Text = "You are playing with Alfons"; } } private void Form1_Load(object sender, EventArgs e) { } private void buttonList_Click(object sender, EventArgs e) //listar djuren { textBoxResult.Clear(); labelInfo.Text = "Here are your list of all available animals"; ListAnimals(); } private void buttonPlay_Click(object sender, EventArgs e) //Play Fetch knappen { textBoxResult.Clear(); label2.Text = "Which animal do you want to play with?"; textBoxInput_TextChanged(sender, e); } private void buttonFeed_Click(object sender, EventArgs e) //Feed knappen { textBoxResult.Clear(); label2.Text = "Which animal do you want to feed?"; } private void labelInfo_Click(object sender, EventArgs e) { } private void label2_Click(object sender, EventArgs e) { } private void textBox1_TextChanged(object sender, EventArgs e) { } public void ListAnimals() { foreach (Animal animal in ListPets) { textBoxResult.AppendText(Text = "\r\n" + animal.Name); } } private void buttonEnter_Click(object sender, EventArgs e) { } } class Petowner { public Petowner() { } } abstract class Animal { protected int Age { get; set; } public string Name { get; set; } protected string FavFood { get; set; } protected string Breed { get; set; } protected bool Hungry { get; set; } public virtual string Interact() { string fetch = "You are playing with animal"; return fetch; } public virtual void Eat(string inFood) { } public virtual void HungryAnimal() { } } class Cat : Animal { public Cat(string inName, int inAge) { this.Name = inName; this.Age = inAge; this.Breed = "Mixed race"; this.FavFood = "Mouse"; } public override string Interact() { string fetch = "You are playing fetch with Stolle"; return fetch; } public override void HungryAnimal() { } } class Dog : Animal { public Dog(string inName, int inAge) { this.Name = inName; this.Age = inAge; this.FavFood = "Chicken"; this.Breed = "Finnish Lapphund"; } public override string Interact() { string fetch = "You are playing fetch with Alfons"; return fetch; } } class Puppy : Dog { protected int Months { get; set; } public Puppy(int months, string inName, int inAge) : base(inName, inAge) { this.Months = months; } public override string Interact() { string fetch = "You are playing fetch with Pajas"; return fetch; } } }

Permalänk
Medlem
Skrivet av Secret_:

Jag har försökt med cat.Interact(); likt det ni rekommenderade för TS men det går inte, står: "An object reference is required for the non-static field, method, or property 'Cat.Interact()' JOPPESHUNDARV1"

Jag har försökt med ListPets[0].Interact();
Här får jag inget felmeddelande men när jag trycker på knappen "Feed" så händer ingeting.

Fundera på vad som händer när du anropar Interact(). Vad returnerar metoden, och vad gör du med returvärdet? Vad vill du ska hända?

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB

Permalänk
Medlem

@Pamudas:
Hmmmm juste, just nu kan den inte returnera en text då jag inte har specifierat var texten ska returneras... eller?

Jag har redan försökt med

public override string Interact() { labelInfo.Text = "You are playing with Stolle"; }

Men det fungerar heller inte då jag inte kan nå metoden från klassen Cat.....

Permalänk
Medlem
Skrivet av Secret_:

Jag har försökt med cat.Interact(); likt det ni rekommenderade för TS men det går inte, står: "An object reference is required for the non-static field, method, or property 'Cat.Interact()' JOPPESHUNDARV1"

Interact är en instansmetod, d.v.s. en helt vanlig metod som inte är deklarerad static. En sån metod kan endast anropas på en instans av en klass och inte på klassen själv:

Cat misse; misse.Interact(); // Ok, anropar Interact på Cat-instansen misse. Cat.Interact(); // Fel, Cat är en klass och inte en instans.

D.v.s. Cat representerar här djurrasen katt, medan misse är en specifik katt-individ. Att anropa Cat.Interact() är som att försöka klappa djurrasen katt ListPets[0].Interact() fungerar förstås, eftersom ListPets är en lista med Animal-instanser.

Skrivet av Secret_:

Hmmmm juste, just nu kan den inte returnera en text då jag inte har specifierat var texten ska returneras... eller?

Interact returnerar en sträng, problemet är att du inte tar emot strängen och gör någonting med den. Du behöver inte ändra på vad Interact gör, utan på koden som anropar Interact.

Permalänk
Medlem
Skrivet av perost:

ListPets[0].Interact() fungerar förstås, eftersom ListPets är en lista med Animal-instanser.

Interact returnerar en sträng, problemet är att du inte tar emot strängen och gör någonting med den. Du behöver inte ändra på vad Interact gör, utan på koden som anropar Interact.

Först av allt, tack för svar och att du tar dig tid att försöka hjälpa mig!

Nu förstår jag inte riktigt vad du menar, jag har anropat metoden Interact korrekt dvs med ListPets[0].Interact(), eller?

Menar du att jag ska ha kvar den men att jag ska lägga till ytterliggare kod?

Jag har alltså gjort rätt än så länge, det ända jag ska klura ut är att ta emot strängen från metoden Interact och på något sätt printa ut det på min label labelInfo, tänker jag rätt här?

Permalänk
Medlem
Skrivet av Secret_:

Först av allt, tack för svar och att du tar dig tid att försöka hjälpa mig!

Nu förstår jag inte riktigt vad du menar, jag har anropat metoden Interact korrekt dvs med ListPets[0].Interact(), eller?

Menar du att jag ska ha kvar den men att jag ska lägga till ytterliggare kod?

Jag har alltså gjort rätt än så länge, det ända jag ska klura ut är att ta emot strängen från metoden Interact och på något sätt printa ut det på min label labelInfo, tänker jag rätt här?

Precis, just nu anropar du bara metoden som returerar en sträng. Men du gör inget med värdet från metoden.

Permalänk
Medlem

@zaibuf:

Ja precis men jag har försökt att skriva ut text på min label med labelInfo.Text""; men det går inte heller... Hur skriver man annars ut något?

Permalänk
Medlem
Skrivet av Secret_:

@zaibuf:

Ja precis men jag har försökt att skriva ut text på min label med labelInfo.Text""; men det går inte heller... Hur skriver man annars ut något?

Tilldena labelInfo.Text värdet av det Interact() returnerar Du gör inte fel, du gör bara inte något med returvärdet efter du kallat på metoden.

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB