Member 12652642 Ответов: 2

Как сделать уравнение в частном классе и передать его для добавления в форму клиента


Привет,

Прямо сейчас я могу сделать уравнение, которое хочу, просто найти и показать его в своей форме "добавить нового пациента". Но я знаю, что то, как я это делаю, не будет иметь значения, передаваемого в фактическую форму "записи пациентов", которую я строю.

Во-первых, я покажу свой класс

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

namespace PatientRecords
{
    public  class Intake
    {
        private string name;
        private int patientId;
        private int weight;
        

        //Constuctor
        public Intake() { }

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

        }
        public double GetProteinIntake()
        {
          
            return weight * .86;
        }

        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 override string ToString()
       {
           return string.Format("Name: {0}, PatientId: {1}, Weight: {2}", Name, PatientId, Weight);
       }
    }
}


Edit: я буду честен и скажу, что сейчас я еще больше потерян. Я учился из книги "Murach C# 2015", и единственный опыт, который у меня был, - это использование лямбда-оператора и тела выражения. Я думаю, что понимаю, что вы говорите в том смысле, что делаете все в одном классе, но это совершенно новое в том, как я это делаю. Это просто код, который вы опубликовали

использование системы;
использование системы.Коллекции.Общий;
использование системы.ComponentModel;
используя системы.Сведения;
использование системы.Рисование;
использование System. Linq;
используя системы.Текст;
использование системы.Нарезание резьбы.Задачи;
использование системы.Окна.Формы;

пространство имен PatientForm
{

публичный частичный класс пациент: форма
{

// прокомментировал, Не понимаю этого, кроме того, как я использовал его в своей форме приема, которой другой пользователь научил меня этому в сжатом виде. public Patient { get; private set; }
общественный пациент()
{
метод InitializeComponent();
}


частный недействительными btnSave_Click(объект отправителя, EventArgs в электронной)
{
{
int patId;
если (! int.Метод tryparse(txtPatientId.Текст, out patId))
{
Ящик для сообщений.Показать ("пожалуйста, введите действительный идентификатор пациента");
вернуть;
}
инт patWeight;
если (! int.Метод tryparse(txtWeight.Текст, out Pat weight))
{
Ящик для сообщений.Показать ("пожалуйста, введите действительный вес пациента");
вернуть;
}
Пациент = новый пациент(txtName.Текст, patId, patWeight);
}
}
частная btnExit_Click недействительным(объект отправителя, EventArgs в электронной)
{
этот.Закрывать();
}
}
}

Что я уже пробовал:

А вот моя анкета для добавления пациента.

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 PatientRecords
{
    public partial class Add_Patient_Info : Form
    {
        public static Intake intake = null;
        public Intake GetNewPatient ()
        {
            this.ShowDialog();
            return intake;
        }

        public Add_Patient_Info()
        {
            InitializeComponent();
        }

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

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

            }
            catch (OverflowException)
            {

            }
        }
    }

2 Ответов

Рейтинг:
8

Matt T Heffron

Тут несколько вещей не так:
Во-первых, вы отбрасываете потребление, которое вы создаете в методе btnCalculate_Click. Попробуйте (включая предложения оригинального Гриффа, приведенные выше):

private void btnCalculate_Click(object sender, EventArgs e)
{
int patId;
if (!int.TryParse(txtPatientId.Text, out patId))
   {
   MessageBox.Show("Please enter a valid Patient ID");
   return;
   }
int patWeight;
if (!int.TryParse(txtWeight.Text, out patWeight))
   {
   MessageBox.Show("Please enter a valid Patient Weight");
   return;
   }
intake = new Intake(txtName.Text, patId, patWeight);
txtProtein.Text = intake.GetProteinIntake().ToString();
}

В частности, не создавайте локальную переменную intake в методе используйте поле class.
Далее, это поле класса intake наверное, не должно быть static Он должен быть специфичен для экземпляра формы.

Кроме того, есть и другие упрощения, которые вы можете сделать.
Во-первых, в классе приемника вам не нужно явно объявлять "резервные поля" для 3-х свойств. Вы можете позволить компилятору сделать это за вас.
public class Intake
{
    private string name;
    private int patientId;
    private int weight;
// ...
    public string Name { get; set; }
    public int PatientId { get; set; }
    public int Weight { get; set; }

Затем в GetProteinIntake метод, изменение в использовании Weight вместо weight.
Кроме того, этот метод можно легко изменить на свойство get-only, например:
public double ProteinIntake { get { return Weight * .86; } }

Я переименовал его, чтобы он выглядел как собственность.
Тогда он будет использоваться как:
txtProtein.Text = intake.ProteinIntake.ToString();


Рейтинг:
20

OriginalGriff

То, что у вас там есть, должно работать - но я бы посоветовал вам не использовать Convert.ToXXX, а вместо этого использовать TryParse:

private void btnCalculate_Click(object sender, EventArgs e)
    {
    int patId;
    if (!int.TryParse(txtPatientId.Text, out patId))
       {
       MessageBox.Show("Please enter a valid Patient ID");
       return;
       }
    int patWeight;
    if (!int.TryParse(txtWeight.Text, out patWeight))
       {
       MessageBox.Show("Please enter a valid Patient Weight");
       return;
       }
    Intake intake = new Intake(txtName.Text, patId, patWeight);
    txtProtein.Text = intake.GetProteinIntake().ToString();
    }

Вы можете обнаружить, что это работает.
И пожалуйста: никогда не" глотайте " исключения - это очень затрудняет отладку кода, когда вы делаете это, так как вы не знаете, когда что-то терпит неудачу. Сообщите об этом пользователю или запишите в журнал для последующего анализа-но никогда не проглатывайте его и не двигайтесь дальше.

И если вы собираетесь работать с умножением чисел на 0,86, я настоятельно рекомендую вам использовать двойные значения вместо целых чисел.

"Я знаю о различных переменных уровня класса, которые я считаю, публичные и частные, и

Я пытаюсь взять информацию из формы добавления пациента в список (который я не могу опубликовать в данный момент, так как нахожусь на работе)."


Итак, посмотрите на то, что Мэтт предлагает в решении 2 - это все хорошие идеи.
Если вы добавляете нового пациента в список в другой форме, то вы либо хотите вернуть нового пациента как экземпляр класса через свойство, и пусть предыдущая форма (которая, как я предполагаю, имеет список) занимается его отображением.
Это не так уж плохо-проверьте текстовые поля, как указано выше, и используйте класс пациента уровня класса для возврата нового экземпляра - удалите класс "прием" и создайте вместо него класс пациента.
затем
public Patient { get; private set; }

и ваш щелчок делает проверку, а затем:
Patient = new Patient(txtName.Text, patId, patWeight);

И закрывает форму, возвращая DialogResult. OK

Затем родительская форма собирает информацию:
frmNewPatient fnp = new frmNewPatient();
if (fnp.ShowDialog() == DialogResult.OK)
   {
   Patient theNewGuy = fnp.Patient;
   ... display the new patient in the Listbox ...
   }
Таким образом, вы передаете информацию, которая вам нужна, вместо того, чтобы создавать класс для работы с крошечным кусочком довольно неуместной информации о пациенте!

В этом есть смысл?


Member 12652642

Простите мое невежество, но сможет ли это передать потребление белка в другую форму, которую я сделал, чтобы добавлять и удалять записи? Я спрашиваю, потому что для него нет конкретной переменной.

OriginalGriff

Это сложно, потому что я не знаю точно, что вы делаете.
Проблема в том, что вы создаете новый экземпляр класса Input в своем методе Calculate, но вы нигде его не "храните" - поэтому он отбрасывается, когда метод заканчивается. Вы действительно держите значение потребления белка рассчитанным (вы храните его в своем текстовом поле), так что вы можете использовать его, но это зависит от того, что вы пытаетесь сделать, как вы действительно должны подходить к этому.
Ясно, что вы не делали этого долго, но я не знаю, как много вас научили - так что это действительно трудно объяснить, не добавляя к вашему замешательству новых понятий! :смеяться:
Так...
Вы знаете, что такое экземпляр? Переменная уровня класса? Как вы показываете пользователю другую форму и откуда вы ее показываете?

Member 12652642

Я знаю о различных переменных уровня класса, которые, как мне кажется, являются публичными и частными, и

Я пытаюсь взять информацию из формы добавления пациента в список (который я не могу опубликовать в данный момент, так как нахожусь на работе).

OriginalGriff

Ответ обновлен.

Member 12652642

Все имеет смысл, кроме создания нового класса. Я согласен, что приемный класс был не нужен, Но тогда вы сказали сделать новый класс с именем пациент? Может быть, я не понимаю, как работают переменные уровня класса.

Я предполагаю, что fnp сродни указателю файла в c? У меня есть некоторый опыт работы с C, почти никакой в C#, как вы заметили!

OriginalGriff

:смеяться:
fnp-это просто имя переменной! Это переменная, которая содержит форму-форму" новый пациент", в которую пользователь вводит данные.

Я предлагаю вам выбросить не переменную, содержащую экземпляр класса input, а весь класс. Замените его классом, который содержит всю информацию о пациенте, а также свойства и методы, которые работают с пациентом.
Если хотите, подумайте о классе как о" супер-пупер " структуре в C, а о переменной как о указателе C - это очень похоже во многих отношениях, но система сортирует разыменование для вас за кулисами. Это еще не все, но для начала достаточно хорошо.
Вы читаете курс C# или пользуетесь книгой? Пожалуйста, не говорите, что вы пытаетесь поднять его на ходу!

Member 12652642

Обновление: я обновил свой вопрос. Теперь я еще более потерян.

OriginalGriff

Нет.
Ваш пациент-это не форма, это не то, с чем пользователь взаимодействует непосредственно. Это "хранилище" для хранения связанной информации.
Подумайте о том, как хирургический врач обращается с пациентами: каждый получает папку с номером пациента на ней, и папка содержит имя, адрес и историю болезни одного пациента. А в большой комнате-множество картотечных шкафов, каждый из которых содержит 1000 папок, каждая для своего пациента.
Когда пациент идет на прием к врачу, кто-то идет в комнату, находит нужную папку и дает ее доктору почитать.
Пациент общается с доктором, но не имеет права приближаться к его папке! Врач обновляет папку со своими последними анализами и процедурами и говорит пациенту, что делать.

В этом сценарии врач - это форма, папка-экземпляр класса пациента, а пациент-пользователь.
Когда новый пациент присоединяется к операции, он взаимодействует с регистратором, чтобы получить новую папку, которую можно передать врачу. В данном случае регистратор-это "новая форма пациента".

Таким образом, у вас есть основная форма (врач), новая форма пациента (регистратор), обе из которых взаимодействуют с классом пациента от имени пользователя.
Есть ли в этом смысл?