Autor Beitrag
Tiborius
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Mo 02.05.16 13:11 
Hi

Ich habe einen Rechner gebaut der verschiedene Rohstoffe ausgibt. Ich möchte aber das wenn Rohstoff_1 <=0 das der Text dann im Label nicht angezeigt wird.

Zur Zeit habe ich es für die bessere Übersicht jedes Rohstoff in ein eigenes Label gepackt und dann mit if abgefragt.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
            if(iron <= 0)
            {
                lblAusgabe_1.Text = "";
            }
            else
            {
                lblAusgabe_1.Text = iron + "\nIron";
            }
            lblAusgabe_2.Text = copper + "\nCopper";
            lblAusgabe_3.Text = cobalt + "\nCobalt";
            lblAusgabe_4.Text = silicon + "\nSilicon";
            lblAusgabe_5.Text = magnesium + "\nMagnesium";
            lblAusgabe_6.Text = stone + "\nStone";
            lblAusgabe_7.Text = promethium + "\nPromethium";
            lblAusgabe_8.Text = neodymium + "\nNeodymium";
            lblAusgabe_9.Text = sathium + "\nSathium";
            lblAusgabe_10.Text = erestrum + "\nErestrum";
            lblAusgabe_11.Text = zascosium + "\nZascosium";


Das Problem dabei, es rückt dann nicht nach Link wenn mal ein Rohstoff nicht angezeigt wird. Wenn ich jetzt alles in eine Label mache dann weiß ich nicht wie ich dann abfragen kann wie der Wert des Rohstoffes ist.

Falls es etwas hilft, hier auch mal die Berechnung der Rohstoffe von einem Bauteil.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
        void HoverCargoBox()
        {
            try
            {
                UInt64 Variable = Convert.ToUInt64(txtHoverCargoBox.Text);
            }
            catch (FormatException)
            {
                txtHoverCargoBox.Text = "0";
            }
            double wert = Convert.ToDouble(txtHoverCargoBox.Text);
            iron += wert * 5;
            cobalt += wert * 5;
            silicon += wert * 5;
            copper += wert * 5;
        }


Gruß Tiborius


Moderiert von user profile iconChristian S.: Topic aus C# - Die Sprache verschoben am Mo 02.05.2016 um 15:37
erfahrener Neuling
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 233
Erhaltene Danke: 19

Win 7, Win 10
C#, ASP-MVC (VS 2017 Community), MS SQL, Firebird SQL
BeitragVerfasst: Mo 02.05.16 13:31 
Hi,

ich weiß nicht, ob ich das richtig verstanden hab. Willst du immer nur ein Label, mehrere nach Gruppen oder immer alle anzeigen?

Aufjedenfall kannst du doch einfach an der Stelle, wo sich ein Wert ändert, zB stone, einfach prüfen, ob der Wert größer 0 ist und wenn ja, das entsprechende Label anzeigen.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
private int stone;    //deine int Variable stone

//dein Feld Stone
public int Stone 
{
    get { return this.stone}
    set
    {
        this.stone = value;
        if (this.stone > 0
            this.labelAusgabe_Stone = this.stone + "\nstone";  //oder .Visible = true; was auch immer du mit dem Label machen willst
            
    {
}

Was öffentliche Felder {get; set;} sind, weißt du ja bestimmt.

Gruß
Julian

Für diesen Beitrag haben gedankt: Tiborius
Tiborius Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Mo 02.05.16 13:45 
Was get / set ist weiß ich leider noch nicht aber ich glaube ich habe eine Lösung gefunden. Ich werde berichten wie es gelaufen ist.

edit*
Ich habe es wahrscheinlich so umständlich wie möglich gemacht aber wenn man lernt ist man stolz das was funktioniert^^

Ich habe jetzt für jeden Rohstoff ein string erstellt. Der string bekommt dann den Wert des Rohstoffes und dann wird eine abfrage gemacht ob Wert <= 0 ist.
Dann werden alle strings in einem Lable ausgegeben.

so sieht das aus
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
public string ironText;
public string copperText;

ironText = iron + " Iron ";
copperText = copper + " Copper";

if(iron <= 0)
{
     ironText = "";
}

lblAusgabe_1.Text = ironText + copperText;
C#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Mo 02.05.16 14:20 
Hey,

also zuerst einmal sollte man UI Logik nicht in die Zugirffsmodifikatoren (get- und set-Funktionen) schreiben, da gehören Validierungen und Logik, die die Variable betreffen, rein.

Zu deinem Problem:
Ich würde deine Materialien in eine eigene Klasse packen, damit du flexibler bist und nicht immer eine neue Variable für jeden Rohstoff anlegen musst. Ich habe das mal gemacht und die Klasse RawMaterial genannt:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
  public class RawMaterial
  {
    public string Name { get; set; }

    public int Amount { get; set; }

    public RawMaterial(string name, int amount)
    {
      Name = name;
      Amount = amount;
    }
  }

Die zwei Variablen Name und Amount sind sogenannte Eigenschaften. Name gibt einfach den Namen deines Rohstoffs an und Amount den Wert bzw die Menge des Rohstoffs.

In der Form habe ich eine ListView angelegt (um von den Labels wegzukommen), in der die Rohstoffe angezeigt werden. Im Code der Form habe ich dann eine Liste der Rohstoffe angelegt
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
    private List<RawMaterial> materials = new List<RawMaterial>
    {
      new RawMaterial("Copper"0),
      new RawMaterial("Cobalt"0),
      new RawMaterial("Silicon"0),
      new RawMaterial("Magnesium"0),
      new RawMaterial("Stone"0),
      new RawMaterial("Promethium"0),
      new RawMaterial("Neodymium"0),
      new RawMaterial("Sathium"0),
      //...
    };

Um nun die Rohstoffe auf der Form anzuzeigen, musst du die ListView updaten. Ich habe dass mit einem Button gelöst:
ausblenden 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:
private void butCreateRandom_Click(object sender, EventArgs e)
    {
      foreach (RawMaterial material in materials)
      { 
        material.Amount = random.Next(010);
      }
      UpdateMaterialsListView();
    }

    private void UpdateMaterialsListView()
    {
      listViewMaterials.SuspendLayout();
      listViewMaterials.Items.Clear();
      foreach (RawMaterial material in materials)
      {
        if (material.Amount <= 0)
          continue;
      
        ListViewItem item = new ListViewItem(material.Name);
        item.SubItems.Add(new ListViewItem.ListViewSubItem(item, material.Amount.ToString()));
        listViewMaterials.Items.Add(item);
      }
      listViewMaterials.ResumeLayout(true);
    }

In meinem Fall werden den Rohstoffen einfach irgendwelche zufälligen Werte zugewiesen. Die Methode UpdateMaterialsListView sorgt dann für das anzeigen der Rohstoffe.
In der foreach Schleife wird dann auch geprüft, ob ein Rohstoff überhaupt da ist (ob der Amount größer 0 ist)

Ich habe das Beispielprojekt auch im Anhang wenn du es dir mal testen willst.
Einloggen, um Attachments anzusehen!
_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler

Für diesen Beitrag haben gedankt: Tiborius