Перезапись данных в файл, C#, банкомат

Помогите решить эту задачу. как сделать чтобы после заполнения поля формы winForm в visual studio перезаписывал данные в файле. Тема Банкомат С#. Чтобы когда например выбирал поле Внести деньги и писал сумму 200р, изначально было 8000р он все выполняет и баланс становится 8200, но когда выхожу из программы и заново захожу, баланс опять 8000р. Читай из файла xml, там сразу прописанно что изначально баланс 8000р, хочется чтобы после внесения и выхода из форма в файле xml перезаписалось на 8200 Хочу чтобы от туда перезаписывал данные.

Вод Коды программы:
Код Form

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace BS
{
    public partial class Form1 : Form
    {
        client Cl = new client();
        account Ac;
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            label1.Text = "Введите Пин-Код";
        }
 
        /*OK*/private void buttonOK_Click(object sender, EventArgs e)
        {
            switch (label1.Text)
            {
                case "Введите Пин-Код":
                    {
                        if (textBox1.Enabled)
                            if (Cl.correctPincode(textBox1.Text))
                            {
                                textBox1.Text = "";
                                label1.Text = "Вход подтвержден!\nВыберите следующее действие.";
                                Ac = new account(Cl.AccountNumber);
                                buttonWITHDRAW.Visible = true;
                                buttonADD.Visible = true;
                                buttonBALANCE.Visible = true;
                                textBox1.Enabled = false;
                            }
                            else
                            {
                                label1.Text = "Неверный Пин-Код! \nВход не Выполнен!";
                                buttonWITHDRAW.Visible = false;
                                buttonADD.Visible = false;
                                buttonBALANCE.Visible = false;
                                textBox1.Enabled = false;
                            }
                        break;
                    }
                case "Снять деньги":
                    {
                        label1.Text = Ac.withdraw(Convert.ToInt32(textBox1.Text));
                        buttonWITHDRAW.Visible = true;
                        buttonADD.Visible = true;
                        buttonBALANCE.Visible = true;
                        textBox1.Enabled = false;
                        break;
                    }
                case "Внести деньги":
                    {
                        label1.Text = Ac.AddToYourAccount(Convert.ToInt32(textBox1.Text));
                        buttonWITHDRAW.Visible = true;
                        buttonADD.Visible = true;
                        buttonBALANCE.Visible = true;
                        textBox1.Enabled = false;
                        break;
                    }
            }
        }
 
        /*BALANCE*/private void buttonBALANCE_Click(object sender, EventArgs e)
        {
            label1.Text = Ac.ShowYourBalance();
            buttonWITHDRAW.Visible = true;
            buttonADD.Visible = true;
            buttonBALANCE.Visible = false;
            textBox1.Enabled = false;
        }
 
        /*ЖМЯК ЦИФОРКИ*/private void button14_Click(object sender, EventArgs e)
        {
            textBox1.Text += (sender as Button).Text;
        }
 
        /*ВЫХОД ИЗ ПРОГРАММЫ*/private void buttonExit_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
 
        /*BACKSPACE*/private void buttonBACKSPACE_Click(object sender, EventArgs e)
        {
            if (textBox1.Text.Length > 1)
            {
                char[] str = textBox1.Text.ToCharArray();
                textBox1.Text = "";
                for (int i = 0; i < str.Length - 1; i++)
                {
                    textBox1.Text += str[i];
                }
            }
            else
                textBox1.Text = "";
        }
 
        /*WITHDRAW*/private void buttonWITHDRAW_Click(object sender, EventArgs e)
        {
            label1.Text = "Снять деньги";
            buttonWITHDRAW.Visible = false;
            buttonADD.Visible = false;
            buttonBALANCE.Visible = false;
            textBox1.Enabled = true;
        }
 
        /*ADD*/private void buttonADD_Click(object sender, EventArgs e)
        {
            label1.Text = "Внести деньги";
            buttonWITHDRAW.Visible = false;
            buttonADD.Visible = false;
            buttonBALANCE.Visible = false;
            textBox1.Enabled = true;
        }
 
        private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!(Char.IsDigit(e.KeyChar)))
            {
                if (e.KeyChar != (char)Keys.Back)
                {
                    e.Handled = true;
                }
            }
        }
 
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
 
        }
    }
}

Код Account

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
 
namespace BS
{
    class account
    {
        public account(int id)
        {
            Balance(id);
        }
        private void Balance(int Id)
        {
            XDocument XD = XDocument.Load("Account.xml");
            foreach (XElement XE in XD.Root.Elements())
            {
                if (XE.Attribute("Id").Value.ToString() == Id.ToString())
                {
                    balance = Convert.ToInt32(XE.Attribute("Symma").Value.ToString());
                    break;
                }
            }
        }
        private int balance;
 
        public string withdraw(int Sym) // Снять
        {
            string mes = "";
            if (Sym>=100)
                if(balance>Sym)
            {
                balance -= Sym;
                mes = "Сумма снята со счета.";
            }
            else
            {
                mes = "Не достаточно средств на счете!";
            }
 
         else
            {
                mes = "Сумма должна быть более 100р!";
            }
            return mes;
        }
        public string AddToYourAccount(int Sym)// внести
        {
            string mes = "";
            if (Sym < 100)
            {
                mes = "Сумма должна быть более 100р!";
                return mes;
            }
            else
            {
                balance += Sym;
            }
            return "Сумма " + Sym.ToString() + " добавлена на счет";
 
        }
 
        public string ShowYourBalance()// баланс
        {
            return "Ваш баланс " + balance.ToString() + " RUB";
        }
    }
}

Код Account.xml


accounts
  account Id ="0" Symma="100"
  account Id ="1" Symma="8000"
  account Id ="2" Symma="1000000"
/accounts

Код Clients

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
 
namespace BS
{
    class client
    {
        public client()
        { 
        }
        public bool correctPincode(string pincode)
        {
            bool Tr = false;
            //читаем из XML
            XDocument XD = XDocument.Load("Client.xml");
            foreach (XElement XE in XD.Root.Elements())
            {
                if (XE.Attribute("pincode").Value.ToString() == pincode)
                {
                    AccountNumber = Convert.ToInt32(XE.Attribute("id").Value.ToString());
                    Tr = true;
                    break;
                }
            }
            return Tr;
        }
        public int AccountNumber;
    }
}

Clients.xml

clients
  client pincode="1488" id="0"/>
  client pincode="2222" id="1"/>
  client pincode="7538" id="2"/>
/clients>

Сделать функцию перезаписи файла и вызывать её когда угодно.

см. XElement.SetAttributeValue, XDocument.Save.


ЗЫ Symma наверно лучше переименовать в Sum, Amount или Balance если пишете по-английски (и использовать везде только одно из этих слов).
И советую почитать https://ru.hexlet.io/blog/posts/naming-in-programming, https://ru.hexlet.io/blog/posts/naming-errors-1 и улучшить имена функций и переменных: например, ReadBalance вместо Balance.

тут сразу можно return true;

1 лайк

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

Так делайте аналогично коду чтения

только вместо чтения меняйте через

и в конце


Там кстати вместо цикла можно как-то так искать элемент по id:

XElement accountElement = XD.Root.Descendants("account")
   .FirstOrDefault(el => el.Attribute("Id") != null &&
                         el.Attribute("Id").Value == Id.ToString());
if (accountElement != null) {
    ...
}
1 лайк

Может я бы вам на почту скинул программу, вы бы мне подправили или что-нибудь придумать можно. У меня просто ещё есть идеи, скинул бы полный текст задания вам) если не сложно

А то реально мозгов не хватает, а перезапись в WinForme надо где-то писать?

Если сможете, отпишитесь пожалуйста

XElement.SetAttributeValue XD = XDocument.Sace("Account.xml")
foreach (XElement XE in XD.Root.Elements())
            {
                if (XE.Attribute("Id").Value.ToString() == Id.ToString())
                {
                    balance = Convert.ToInt32(XE.Attribute("Symma").Value.ToString());
                    break;
                }
            }

Так получается перезапись?

Нет.
XDocument.Load, найти элемент, поменять значение, XD.Save.

Сначала надо сделать функцию сохранения.
С текущим кодом проще всего добавить в классе Account функцию Save, которая перезаписывает файл используя значение из

И потом вызывать её либо из событий формы, где вы меняете баланс, либо при закрытии программы, либо прямо из Withdraw и т.п. в Account.

Получить готовое решение — не эффективный способ обучения.
Читайте что-нибудь, пробуйте, делайте перерывы, задавайте вопросы если что-то долго не получается.

На мой взгляд в качестве перерыва можно делать сочетание: чтение тех. документации и учебников с художественной литературой или просмотром фильмов и т. д.
Если грузиться только учебниками, наскучит быстро.

Спорт и прогулки еще помогают )

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

Думаю меня можно понять, почти все доделано, но осталось совсем чуть-чуть. А я бы в вашем коде разобрался или уже у вас бы спросил

Тогда лучше писать в раздел Фриланс тут или на фриланс-площадках )

1 лайк

А вы сможете исправить мой код?

Не, я занят сейчас и “срочно” вряд ли смогу, и мне это не особо интересно (

1 лайк

Так до четверга времени вполне достаточно для разобраться с моментами по работе с файлами.
Да и всегда можно пойти на пересдачу, до сентября так вообще времени море :slight_smile:


Вадим
prioraa844, на кибере нашел похожее студенческое задание (2014-й год), тема отмечена как решенная. Посмотрите в качестве примера, возможно поможет. Архивы не просматривал, за корректность выполнения работы не ручаюсь.
Реализация интерфейса банкомата.rar (224.6 КБ)

это и есть код из этой темы :partyparrot:

Прикольно :sunglasses: . Тогда ТС однозначно во фриланс отнесет 10 $, или учиться начнет :face_with_monocle: