Thay đổi thông tin cá nhân trong phần mềm Quản lý quán cafe với C# Winform

Lập trình phần mềm Quản lý quán cafe với C# Winform

5.0 (2 đánh giá)
Tạo bởi HowKteam Cập nhật lần cuối 4 năm trước 40.005 lượt xem 10 bình luận
Tác giả/Dịch giả: HowKteam
Học nhanh

Danh sách bài học

01. Thiết kế cơ sở dữ liệu cho phần mềm Quản lý quán cafe với C# Winform 02. Thiết kế giao diện cho phần mềm Quản lý quán cafe với C# Winform 03. Giới thiệu mô hình 3 lớp (3 Layers) 04. Tạo lớp DataProvider cho phần mềm Quản lý quán cafe với C# Winform 05. Giới thiệu design patern Singleton phần mềm Quản lý quán cafe với C# Winform 06. Tạo chức năng đăng nhập cho phần mềm Quản lý quán cafe với C# Winform 07. Hạn chế lỗi SQL Injection cho phần mềm Quản lý quán cafe với C# Winform 08. Hiển thị số bàn theo CSDL cho phần mềm Quản lý quán cafe với C# Winform 09. Hiển thị hóa đơn theo bàn cho phần mềm Quản lý quán cafe với C# Winform 10. Hiển thị tổng tiền cho phần mềm Quản lý quán cafe với C# Winform 11. Thêm bớt món hóa đơn trong phần mềm Quản lý quán cafe với C# Winform 12. Thanh toán hóa đơn trong phần mềm Quản lý quán cafe với C# Winform 13. Chuyển bàn trong phần mềm Quản lý quán cafe với C# Winform 14. Hiển thị sanh sách hóa đơn trong phần mềm Quản lý quán cafe với C# Winform 15. Thay đổi thông tin cá nhân trong phần mềm Quản lý quán cafe với C# Winform 16. Hiển thị danh sách thức ăn trong phần mềm Quản lý quán cafe với C# Winform 17. Binding thông tin thức ăn trong phần mềm Quản lý quán cafe với C# Winform 18. Thêm, xóa, sửa thức ăn trong phần mềm Quản lý quán cafe với C# Winform 19. Tìm kiếm gần đúng thức ăn trong phần mềm Quản lý quán cafe với C# Winform 20. Hiển thị danh sách tài khoản trong phần mềm Quản lý quán cafe với C# Winform 21. Thêm, xóa, sửa tài khoản trong phần mềm Quản lý quán cafe với C# Winform 22. Mã hóa mật khẩu trong phần mềm Quản lý quán cafe với C# Winform 23. Tạo phím tắt cho phần mềm Quản lý quán cafe với C# Winform 24. Phân trang cho hóa đơn trong phần mềm Quản lý quán cafe với C# Winform 25. Tạo report trong phần mềm Quản lý quán cafe với C# Winform 26. Đóng gói phần mềm Quản lý quán cafe với C# Winform

Thay đổi thông tin cá nhân trong phần mềm Quản lý quán cafe với C# Winform

Không có gì tuyệt vời hơn là luyện tập với ví dụ thực tế. Nào cùng nhau thử thách bản thân với phần mềm: Quản lý quán cafe

Bạn nên có kiến thức về:

  • Lập trình Winform cơ bản
  • Delegate – Event
  • SQL server
  • Xử lý ngày tháng năm

Code data.sql

Code fTableManager.cs

Code fAccountProfile.Designer.cs

Code fAccountProfile.cs

Code fLogin.cs

Code AccountDAO.cs

Code Account.cs

Bài sau chúng ta sẽ cùng nhau tìm hiểu cách hiển thị danh sách thức ăn.

Đừng quên: “Luyện tập – Thử thách – Không ngại khó


Tải xuống

Tài liệu

Nhằm phục vụ mục đích học tập Offline của cộng đồng, Kteam hỗ trợ tính năng lưu trữ nội dung bài học Thay đổi thông tin cá nhân trong phần mềm Quản lý quán cafe với C# Winform dưới dạng file PDF trong link bên dưới.

Ngoài ra, bạn cũng có thể tìm thấy các tài liệu được đóng góp từ cộng đồng ở mục TÀI LIỆU trên thư viện Howkteam.com

Đừng quên likeshare để ủng hộ Kteam và tác giả nhé!

Project

Nếu việc thực hành theo hướng dẫn không diễn ra suôn sẻ như mong muốn. Bạn cũng có thể tải xuống PROJECT THAM KHẢO ở link bên dưới!


Thảo luận

Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng.

Tác giả/Dịch giả

Khóa học

Lập trình phần mềm Quản lý quán cafe với C# Winform

Bạn đã học qua LẬP TRÌNH C# CƠ BẢN? Xong nốt cả LẬP TRÌNH WINFORM lẫn SQL?

Bạn đã chán các bài tập căn bản, muốn thực hành các kiến thức đã học vào một dự án thực tế?

Hay đơn giản bạn là chủ quán café, mong muốn tự tạo nên phần mềm dành cho chính mình sử dụng?

Vậy còn chần chừ gì không tham gia ngay khóa học LẬP TRÌNH PHẦN MỀM QUÁN CAFÉ VỚI C# WINFORM?

Đánh giá

5.0
2 đánh giá
Đánh giá
5
2
4
3
2
1
Vo Tan Duc đã đánh giá 3 năm trước

Hay quá anh Long ơi! Hy vọng có series thực chiến về WPF để em học được nhiều kỹ thuật hơn nữa từ anh và Kteam

lquiitfuture đã đánh giá 5 năm trước

cảm ơn!

Bình luận

Để bình luận, bạn cần đăng nhập bằng tài khoản Howkteam.

Đăng nhập
DongTV đã bình luận 4 năm trước

Mình đã làm đúng theo hướng dẫn phần phân quyền truy cập Form Admin, nhưng khi chạy chương trình, login bằng tài khoản staff thì vẫn truy cập được Form Admin. Nhờ các bạn HKTeam hỗ trợ tư vấn giúp.

//fTableManager:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using QuanLyQuanCafe.DAO;
using QuanLyQuanCafe.DTO;

namespace QuanLyQuanCafe
{
    public partial class fTableManager : Form
    {
        private cAccountDTO loginAccount;

        public cAccountDTO LoginAccount
        {
            get => loginAccount;
            set
            {
                loginAccount = value;
                ChangeAccount(loginAccount.Type);
            }
        }
        public fTableManager(cAccountDTO acc)
        {
            InitializeComponent();

            this.loginAccount = acc;
            LoadTable();
            LoadCategory();
            LoadComboboxTable(cbSwitchTable);
        }

        #region Method
        void ChangeAccount(int type)
        {
            adminToolStripMenuItem.Enabled = type == 1;
            //thôngTinTàiKhoảnToolStripMenuItem.Text += " (" + LoginAccount.DisplayName + ")";
        }
        void LoadCategory()
        {
            List<cCategoryDTO> listCategory = cCategoryDAO.Instance.GetListCategory();
            cbCategory.DataSource = listCategory;
            cbCategory.DisplayMember = "Name";
        }
        void LoadFoodListByCategoryID(int id)
        {
            List<cFoodDTO> listFood = cFoodDAO.Instance.GetFoodByCategoryID(id);
            cbFood.DataSource = listFood;
            cbFood.DisplayMember = "Name";
        }
        void LoadTable()
        {
            flpTable.Controls.Clear();
            List<cTableDTO> tableList = cTableDAO.Instance.LoadTableList();

            foreach (cTableDTO item in tableList)
            {
                Button btn = new Button()
                {
                    Width = cTableDAO.TableWidth,
                    Height = cTableDAO.TableHeight 
                };
                btn.Text = item.Name + Environment.NewLine + item.Status;
                btn.Font = new Font(btn.Font.Name, btn.Font.Size, FontStyle.Italic);
                btn.Click += Btn_Click;
                btn.Tag = item; // Tag có kiểu dữ liệu là Object

                switch (item.Status)
                {
                    case "Trống":
                        btn.BackColor = Color.YellowGreen;
                        break;
                    default:
                        btn.BackColor = Color.Gold;
                        break;
                }
                flpTable.Controls.Add(btn);
            }
        }
        void ShowBill(int id)
        {
            lsvBill.Items.Clear();//Xóa dữ liệu cũ trên listview trước khi thêm mới
            List<cMenuDTO> listBillInfo = cMenuDAO.Instance.GetListMenuByTable(id);
            float TotalPrice = 0;
            foreach (cMenuDTO item in listBillInfo)
            {
                ListViewItem lsvItem = new ListViewItem(item.FoodName.ToString());
                lsvItem.SubItems.Add(item.Count.ToString());
                lsvItem.SubItems.Add(item.Price.ToString());
                lsvItem.SubItems.Add(item.TotalPrice.ToString());
                TotalPrice += item.TotalPrice;
                lsvBill.Items.Add(lsvItem);
            }
            // Chuyển đơn vị tiền tệ trong khung TỔNG TIỀN
            //CultureInfo culture = new CultureInfo("en-US"); // Đơn vị tiền tệ USA
            CultureInfo culture = new CultureInfo("vi-VN"); // Đơn vị tiền tệ VietNamese
            Thread.CurrentThread.CurrentCulture = culture;
            txbTotalPrice.Text = TotalPrice.ToString("c", culture);
            //txbTotalPrice.Text = TotalPrice.ToString("c"); // 'c' (currency - tiền tệ) Nếu chỉ chạy mỗi dòng này, thì đvi tiền tệ sẽ chạy theo mặc định của máy tính
        }
        void LoadComboboxTable(ComboBox cb)
        {
            cb.DataSource = cTableDAO.Instance.LoadTableList();
            cb.DisplayMember = "Name";
        }

        #endregion

        #region Events
        private void cbCategory_SelectedIndexChanged(object sender, EventArgs e)
        {
            int id = 0;
            ComboBox cb = sender as ComboBox;
            if (cb.SelectedItem == null)
                return;
            cCategoryDTO selected = cb.SelectedItem as cCategoryDTO;
            id = selected.ID;
            LoadFoodListByCategoryID(id);
        }
        private void Btn_Click(object sender, EventArgs e)
        {
            int tableID = ((sender as Button).Tag as cTableDTO).ID;
            lsvBill.Tag = (sender as Button).Tag;
            ShowBill(tableID);
        }
        private void đăngXuấtToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        private void thôngTinCáNhânToolStripMenuItem_Click(object sender, EventArgs e)
        {
            fAccountProfile f = new fAccountProfile();
            //this.Hide();//Sau khi chọn ToolStrip Admin thì form cha 'fManager' sẽ mất đi
            f.ShowDialog();
            //this.Hide();
        }
        private void adminToolStripMenuItem_Click(object sender, EventArgs e)
        {
            fAdmin f = new fAdmin();
            //this.Hide(); //Sau khi chọn ToolStrip Admin thì form cha 'fManager' sẽ mất đi
            f.ShowDialog();
            //this.Hide();
        }
        private void btnAddFood_Click(object sender, EventArgs e)
        {
            cTableDTO table = lsvBill.Tag as cTableDTO;

            int idBill = cBillDAO.Instance.GetUncheckBillIDByTableID(table.ID);
            int foodID = (cbFood.SelectedItem as cFoodDTO).ID;
            int count = (int)nmFoodCount.Value;

            if (idBill == -1) // TH1: Bill chưa có
            {
                cBillDAO.Instance.InsertBill(table.ID);
                cBillInfoDAO.Instance.InsertBillInfo(cBillDAO.Instance.GetMaxIDBill(), foodID, count);
            }
            else // TH2: Bill đã tồn tại
            {
                cBillInfoDAO.Instance.InsertBillInfo(idBill, foodID, count);
            }
            ShowBill(table.ID);
            LoadTable();
        }
        private void btnCheckOut_Click(object sender, EventArgs e)
        {
            cTableDTO table = lsvBill.Tag as cTableDTO;
            int idBill = cBillDAO.Instance.GetUncheckBillIDByTableID(table.ID);
            int discount = (int)nmDiscout.Value;
            //double totalPrice = Convert.ToDouble(txbTotalPrice.Text.Split(',')[0]); // Cách 1. Chuyển từ chữ sang kiểu số
            float totalPrice = float.Parse(txbTotalPrice.Text, NumberStyles.Currency, new CultureInfo("vi-VN")); // Cách 2. Chuyển từ chữ sang kiểu số
            float finalTotalPrice = totalPrice - (totalPrice / 100) * discount;

            if (idBill != -1)
            {
                if (MessageBox.Show (string.Format("Bạn có chắc thanh toán hóa đơn {0} không ?\nTổng tiền - Tổng tiền x Giảm giá\n= {1} - ({1} x {2}%) = {3} vnđ.", table.Name, totalPrice, discount, finalTotalPrice), "Thông báo", MessageBoxButtons.OKCancel)==System.Windows.Forms.DialogResult.OK)
                {
                    cBillDAO.Instance.CheckOut(idBill, discount, finalTotalPrice);
                    ShowBill(table.ID);
                    LoadTable();
                }
            }
        }
        private void btnSwitchTable_Click(object sender, EventArgs e)
        {
            int id1 = (lsvBill.Tag as cTableDTO).ID;
            int id2 = (cbSwitchTable.SelectedItem as cTableDTO).ID;
            if (MessageBox.Show(string.Format("Bạn có chắc chuyển {0} qua {1} không ?", (lsvBill.Tag as cTableDTO).Name, (cbSwitchTable.SelectedItem as cTableDTO).Name), "Thông báo", MessageBoxButtons.OKCancel) == System.Windows.Forms.DialogResult.OK)
            {
                cTableDAO.Instance.SwitchTable(id1, id2);
                LoadTable();
            }
        }

        #endregion
    }
}
 

//fAccountDAO:

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using QuanLyQuanCafe.DTO;

namespace QuanLyQuanCafe.DAO
{
    public class cAccountDAO
    {
        private static cAccountDAO instance;

        public static cAccountDAO Instance
        {
            get
            {
                if (instance == null) instance = new cAccountDAO();
                return instance;
            }
            private set
            {
                instance = value;
            }
        }
        private cAccountDAO() { } // Đóng kết nối Instance
        public bool Login(string userName, string passWord)
        {
            // Nếu dùng cách này thì sẽ bị lỗi SQL Injection (dễ bị hack)
            //string query = "SELECT * FROM dbo.Account WHERE UserName = N'" + userName + "' AND PassWord = N'" + passWord + "'";

            // Fix SQL Injection dòng trên bằng cách dùng Store Procedure dbo.QLSVP_Login:
            string query = "EXEC dbo.QLQCFP_Login @UserName , @PassWord"; // Nhớ để khoảng trắng phía sau dấu phẩy ',' để tránh lỗi ExecuteQuery đã tạo bên cDataProvider.cs
            DataTable result = cDataProvider.Instance.ExecuteQuery(query, new object[] {userName , passWord});
            return result.Rows.Count > 0; // nếu kết quả đúng
        }
        public cAccountDTO GetAccountByUserName(string userName)
        {
            DataTable data = cDataProvider.Instance.ExecuteQuery("Select * from dbo.Account where UserName = '" + userName + "'");            foreach (DataRow item in data.Rows)
            {
                return new cAccountDTO(item);
            }
            return null;
        }
    }
}
 

//fLogin:

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;
using QuanLyQuanCafe.DAO;
using QuanLyQuanCafe.DTO;

namespace QuanLyQuanCafe
{
    public partial class fLogin : Form
    {
        public fLogin()
        {
            InitializeComponent();
        }

        private void btnLogin_Click(object sender, EventArgs e)
        {
            string userName = txbUsername.Text;
            string passWord = txbPassword.Text;
            if (Login(userName, passWord))
            {
                cAccountDTO loginAccount = cAccountDAO.Instance.GetAccountByUserName(userName);
                fTableManager f = new fTableManager(loginAccount);
                this.Hide(); // Ẩn form login sau khi chọn Đăng nhập & Form Chương trình được mở
                f.ShowDialog(); //ShowDialog : hiển thị ưu tiên trên cùng
                this.Show(); // Hiển thị form login sau khi Close Form Chương trình
            }
            else
            {
                MessageBox.Show("Sai tên tài khoản hoặc mật khẩu !");
            }
        }

        // Hàm kiểm tra login
        bool Login(string userName, string passWord)
        {
            return cAccountDAO.Instance.Login(userName, passWord);
        }
        private void btnExit_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void fLogin_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (MessageBox.Show("Bạn có thật sự muốn thoát chương trình ?", "Thông báo", MessageBoxButtons.OKCancel) != System.Windows.Forms.DialogResult.OK)
            {
                e.Cancel = true;
            }
        }
    }
}
 

//AccountDTO:

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

namespace QuanLyQuanCafe.DTO
{
    public class cAccountDTO
    {
        public cAccountDTO(string userName, string displayName, int type, string passWord = null)
        {
            this.UserName = userName;
            this.DisplayName = displayName;
            this.Type = type;
            this.PassWord = passWord;
        }

        public cAccountDTO(DataRow row)
        {
            this.UserName = row["userName"].ToString();
            this.DisplayName = row["displayName"].ToString();
            this.Type = (int)row["type"];
            this.PassWord = row["passWord"].ToString();
        }

        private string userName;
        private string displayName;
        private string passWord;
        private int type;

        public string UserName { get => userName; set => userName = value; }
        public string DisplayName { get => displayName; set => displayName = value; }
        public string PassWord { get => passWord; set => passWord = value; }
        public int Type { get => type; set => type = value; }
    }
}
 

hthecong đã bình luận 5 năm trước

Phần truyền dữ liệu giữa 2 form, Kteam làm rối quá! Không cần tạo Event gì cả. Chỉ cần tạo một đối tượng Delegate là được. (Bản chất của Event là đóng gói Delegate kèm theo 2 bộ Add và Remove)

Nên làm như sau:

* Để truyền dữ liệu giữa 2 Form: (từ form con sang form chính, fAccountProfile sang fTableManager

1. Ở form chính tạo một hàm làm nhiệm vụ thay đổi dữ liệu: đổi text hiển thị của menuStrip

void ChangeAccountInfo(string info)
        {
            thToolStripMenuItem.Text = "Thông tin tài khoản (" + info + ")";
        }

2. Vì ở form con, không thể gọi trực tiếp hàm đã tạo ở form chính, nên phải gọi thông qua delegate. Ta tạo một thể hiện của delegate Action<string>.

public Action<string> ChangeInfo;

3. Trước khi show form fAccountProfile từ form chính, ta gán giá trị cho delegate ChangeInfo:

private void tsmiAccountInfo_Click(object sender, EventArgs e)
        {
            fAccountProfile fAccount = new fAccountProfile(loginAccount);
            fAccount.ChangeInfo = ChangeAccountInfo;
            fAccount.ShowDialog();
        }

4. Khi update thành công Account, ta gọi delegate ChangeInfo để thực thi hàm ChangeAccountInfo(string info) từ form con:

void UpdateAccount()
        {
            string userName = txtUserName.Text;
            string displayName = txtDisplayName.Text;
            string passWord = txtPassword.Text;
            string newPass = txtNewPass.Text;
            string reEnterPass = txtReEnterPass.Text;

            if (!newPass.Equals(reEnterPass))
            {
                MessageBox.Show("Mật khẩu mới và mật khẩu nhập lại không khớp nhau!", "Thông báo");
            }
            else if(AccountDAO.Instance.UpdateAccount(userName, displayName, passWord, newPass))
            {
                MessageBox.Show("Cập nhật thành công!");

                ChangeInfo.Invoke(displayName); --Thực thi delegate, để gọi hàm đã tạo ở form fTableManager
            }
            else
            {
                MessageBox.Show("Vui lòng điền đúng mật khẩu!");
            }
        }

 

lamtruyen đã bình luận 5 năm trước

Add oi tìm bài học event mãi mà ko thấy

Phạm Tú đã bình luận 6 năm trước

Em bị lỗi CS0051 thì sửa như nào ạ

public fAccountProfile(Accont acc)

{

...

}

tienchungit đã bình luận 7 năm trước

Event mà anh bảo cần xem trước ở đâu ạ? Em tìm mãi mà không thấy

Không có video.