2016-07-24 7 views
0

Ich habe ein wenig Erfahrung mit privaten Klassen mit Murach C# Buch, aber ich bin immer noch sehr ein Neuling. Ich versuche mein eigenes Projekt zu erstellen, das aus einer "Patienten-ID", "Name", "Gewicht" und dann einer Gleichung für die empfohlene tägliche Proteinaufnahme besteht (Gewicht * .86). Dies wird schlussendlich zu einer Basis-Datenbank gemacht werden, aber momentan habe ich Mühe, die Ergebnisse anzuzeigen. Darüber hinaus wird die Berechnung für die tägliche Proteinaufnahme in der Klasse, die ich gemacht habe, nicht funktionieren.Passing Private Class zu Formular

Hier ist mein Klassencode:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace Form1 
{ 
public class Intake 
{ 
    private string name; 
    private int patientId; 
    private int weight; 
    //private int proteinIntake = weight * .86; 


    //Constuctor 
    public Intake() { } 

    //Overload Constructor 
    public Intake(string name, int patientId, int weight) 
    { 
     this.Name = name; 
     this.PatientId = patientId; 
     this.Weight = weight; 


    } 

    public string Name 
    { 
     get 
     { 
      return name; 
     } 
     set 
     { 
      name = value; 
     } 
    } 
    public int PatientId 
    { 
     get 
     { 
      return patientId; 
     } 
     set 
     { 
      patientId = value; 
     } 
    } 
    public int Weight 
    { 
     get 
     { 
      return weight; 
     } 
     set 
     { 
      weight = value; 
     } 
    } 


    public string GetDisplayText(string sep) => 
     name + patientId + sep + weight; 
} 
} 

Hier ist meine Form Code:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace Form1 
{ 
public partial class Form1 : Form 
{ 
    public static Intake intake = null; 


    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void btnExit_Click(object sender, EventArgs e) 
    { 
     this.Close(); 
    } 

    private void btnCalculate_Click(object sender, EventArgs e) 
    { 

     Intake intake = new Intake(txtName.Text, Convert.ToInt32(txtPatientId.Text), Convert.ToInt32(txtWeight.Text)); 

    //obviously does not work MessageBox.Show("Name: " + intake.name); 





    } 


} 
} 

Und, wenn es darauf ankommt, hier ist meine hässliche Form My Ugly Form

+2

Doing 'MessageBox.Show ("Name:" + intake.name) verwenden;' nicht funktionieren, aber tun 'MessageBox.Show ("Name:" + intake.Name); 'sollte gut funktionieren. – Enigmativity

Antwort

2

ich nicht verstehe deine Frage sehr gut, ich habe dein erwähntes Buch nicht gelesen, aber von dem, was ich sehe, ist deine Aufnahmeklasse nicht privat, also ist das einzige Problem, dass du versuchst, ein privates Feld in yo anzuzeigen Ihre MessageBox, und so, wenn Sie die Anweisung auskommentieren, kompiliert sie überhaupt nicht. Also, wenn Sie den Namen Ihrer Instanz in der MessageBox angezeigt werden soll:

MessageBox.Show("Name: " + intake.Name); 

wird sicher arbeiten. Das einzige, was Sie beachten müssen (in diesem Fall), ist der Unterschied zwischen privaten und öffentlichen Eigenschaften. Die privaten Felder sind nur innerhalb Ihrer Klasse zugänglich, die öffentlichen Eigenschaften sind für alle Ihre Programme zugänglich.

Accessibility Levels (C# Reference)

öffentliche

Zugang ist nicht eingeschränkt.


geschützt

Zugang beschränkt sich auf die enthaltenden Klasse oder Typen aus der enthaltenden Klasse abgeleitet.


interne

Zugang ist begrenzt auf die aktuelle Montage.


geschützter interner

Zugang ist begrenzt auf den aktuellen oder Montag Typen aus der Klasse enthält, abgeleitet.


Privat

Der Zugang ist beschränkt auf den Typ enthält.

0

In Ihrer Intake Klasse, fügen Sie das GetProteinIntake() -Methode:

public class Intake 
{ 
    ... your existing code .... 

    public double GetProteinIntake() 
    { 
     return weight * 0.86; 
    } 
} 

In Ihrem Formular ersetzt Ihre btnCalculate_Click Veranstaltung mit:

private void btnCalculate_Click(object sender, EventArgs e) 
{ 
    Intake intake = new Intake(txtName.Text, Convert.ToInt32(txtPatientId.Text), Convert.ToInt32(txtWeight.Text)); 
    txtProtein.Text = intake.GetProteinIntake().ToString(); 
} 
+0

Können Sie das näher ausführen? Ich habe versucht, mit dieser, aber zurück "Fehler \t CS1503 \t Argument 1: kann nicht von 'Double' in 'String' konvertieren" Ich möchte es meinem Textfeld zuweisen, die wäre "txtProtein.Text" –

+0

Oh, Sie sollten den 'public int' in' public double' ändern (achtete nicht auf den numerischen Typ), und dann können Sie 'intake.GetProteinIntake(). ToString()' verwenden, um es dem Textfeld zuzuweisen. – PhillipXT

+0

intake.GetProteinIntake(). ToString (txtProtein.Text); Berechnet es immer noch nicht. Irgendeine Idee warum? –

2

Fyi: in der "Aufnahme" Klasse, können Sie die ToString()

public override string ToString() 
{ 
    return string.Format("Name: {0}, PatientId: {1}, Weight: {2}", Name, PatientId, Weight); 
} 
überschreiben

Und dann kann u

MessageBox.Show(intake.ToString());