首页 > 解决方案 > 将对象从类传递到 Windows 窗体

问题描述

我在这里有四个主要文件:Form 1,称为 frmLogin,Form2,称为 frmUserHome,一个名为 DbConnector.cs 的类和一个名为 BankAccount.cs 的类

该程序的工作原理如下:Form1 从 DBConnector 调用方法 -> DB Connector 方法填充一个对象,它是在 DBConnector 中实例化的变量。此对象属于 BankAccount.cs 类

然后,在方法完成后,如果成功,Form1 将实例化 Form2 并打开它。在 form2 中,我想访问在 DBconnector 类中创建的对象。我该怎么做呢?我已经尝试在其中实例化 BankAccount.cs 的新对象,我已经尝试了我在这里看到的所有这些不同的构造函数。似乎没有任何工作。

供参考:对象在 Dbconnector 中运行时被填充。但是,当我在 Form2 中使用它时尝试接收数据时,所有字段都是 NULL。

我通过阅读此处的不同帖子进行了无数次调整,因此代码现在理所当然地一团糟,并且可能非常无组织。

以下是我的代码的主要部分:Form1

namespace BankingSystem
{
    public partial class frmLogIn : Form
    {
        public BankAccount myBankAccount = new BankAccount();
        dbConnector newConnector;
        public frmLogIn()
        {
            InitializeComponent();
            timerMain.Enabled = true;
            timerMain.Start();
}

        private void btnLogIn_Click(object sender, EventArgs e)
        {
            try
            {
                newConnector.CheckDetailsLogin(accountNumTextBox.Text, pinNumTextBox.Text);
                frmUserHome UserHome = new frmUserHome();
                MessageBox.Show("Success! Happy Banking!");
                UserHome.ShowDialog();
                
            }
            catch
            {
                MessageBox.Show("Failed - incorrect login details.");
            }
            

        }
    }
}

DBConnector 类:

namespace BankingSystem
{
    public class dbConnector
    {
        Boolean isCorrect = false;

        private static SQLiteConnection sqlconnConnection;
        public BankAccount myBankAccount = new BankAccount();


        public DataSet myAppDataSet = new DataSet();   // created for you to use and push data into


        public dbConnector(string strFilePath)
        {
            try
            {
                sqlconnConnection = new SQLiteConnection("Data Source=" + strFilePath);
            }
            catch (Exception ex)
            {
                throw new Exception("DbConnector initialisation unsuccessful:\n" + ex.Message);
            }
        }


        public void CheckDetailsLogin(string strAccno, string strPin)
        {
            // this is where check ou the boiler plate code and adjst to my APP.
            try
            {
                DataTable dtUser = new DataTable();
                sqlconnConnection.Open();
                string strQuery2 = @"SELECT * FROM Accounts WHERE Account_Number='"+ strAccno +"' AND PIN='"+ strPin +"';";  // example of a parametrised SQL statement.
                SQLiteCommand sqlcomCommand2 = new SQLiteCommand(strQuery2, sqlconnConnection);
                SQLiteDataAdapter sqldatadptAdapter = new SQLiteDataAdapter(sqlcomCommand2);  // local SQL data Adaptor                


                try
                {
                    sqldatadptAdapter.Fill(dtUser);
                }
                catch (Exception ex)
                {
                    // Exception will the "thrown"/Raised when there was a problem
                    throw new Exception($"SELECT unsuccessful:\n{ex.Message}");
                }
                finally
                {
                    sqlconnConnection.Close();
                }

                if (dtUser.Rows.Count == 0)
                {
                    // the record set comes back with no records found, an empty Datatable with no rows 
                    // means there was no data matching your query
                    throw new Exception("No Such Bank user found");
                }
                else
                {
                    // change to your applications needs
                    // Rows[0] - we are expecting at least 1 row, and its basically an array so we address
                    // the first element with 0
                    // Rows[0]["fieldnamefromDB"]   <- referencing the column in the DB
                    //this.strID = strUserID;
                    myBankAccount.AccountNumber = dtUser.Rows[0]["Account_Number"].ToString();
                    myBankAccount.AccountPin = dtUser.Rows[0]["PIN"].ToString();
                    myBankAccount.AccountBalance = Convert.ToDecimal(dtUser.Rows[0]["Balance"]);
                    myBankAccount.AccountHolder = dtUser.Rows[0]["First_Name"].ToString();
                    myBankAccount.AccountAddress = dtUser.Rows[0]["Home_Address"].ToString();
                    myBankAccount.MyAccountGUID = dtUser.Rows[0]["GUID"].ToString();
                    if (myBankAccount.AccountNumber == strAccno && myBankAccount.AccountPin == strPin)
                    {
                        isCorrect = true;
                    }
                    else
                    {
                        isCorrect = false;
                    }
                    //myLocalBankAccUsr
                }
            }
            catch (Exception ex)
            {
                // exception thrown for the whole method or function    
                throw new Exception($"User(string):\n{ex.Message}");
            }
        }


 

BankAccount.cs 类

namespace BankingSystem
{
    public class BankAccount
    {
        private string accountNumber;
        private decimal accountBalance;
        private string accountHolder;
        private string accountPhoneNumber;
        private string accountAddress;
        private string accountPin;
        private string myAccountGUID;
        // private string AccountHolderGUID;
        // private string AccountTypeGUID;

        public string AccountNumber 
        { 
            get { return accountNumber; } 
            set { accountNumber = value; } 
        }
        public decimal AccountBalance 
        { 
            get { return accountBalance; } 
            set { accountBalance = value; } 
        }
        public string AccountHolder
        {
            get { return accountHolder; }
            set { accountHolder = value; }
        }
        public string AccountPhoneNumber
        {
            get { return accountPhoneNumber; }
            set { accountPhoneNumber = value; }
        }
        public string AccountAddress
        {
            get { return accountAddress; }
            set { accountAddress = value; }
        }
        public string AccountPin
        {
            get { return accountPin; }
            set { accountPin = value; }
        }

        public string MyAccountGUID 
        { 
            get { return myAccountGUID; } 
            set { myAccountGUID = value; } 
        }

        public Boolean CanWithDrawAmount(decimal AmountToTransfer)
        {
            if (AmountToTransfer > this.AccountBalance){
            return false;
            }else
            {
            return true;
            }
        }
            

        public void UpdatePIN()
        {
            // connect to bank DB connector
            // send it the new pin
            // SQL update command
        }
    }
}

这是表格2:

namespace BankingSystem
{
    public partial class frmUserHome : Form
    {
        public frmUserHome()
        {
            InitializeComponent();
            tabMainForm.Appearance = TabAppearance.FlatButtons;
            tabMainForm.ItemSize = new Size(0, 1);
            tabMainForm.SizeMode = TabSizeMode.Fixed;
            timerMain.Enabled = true;
            timerMain.Start();
        }

        private void frmUserHome_Load(object sender, EventArgs e)
        {
            labelWelcome.Text = "Welcome "; //newMainBank.AccountHolder;

        }

'labelWelcome.Text = "Welcome" 是我希望使用存储在对象中的名称的位置。因此,理想情况下,它应该访问 BankAccount 类,访问 AccountHolder 字段并使用该字段连接到“欢迎”文本的末尾。但是,当我运行程序时,它只显示“欢迎”并且最后没有名称(因为由于某种原因,form2 中的所有值都重置为 null )

标签: c#.netsqlite

解决方案


下面我更新了 Form1 和 Form2 的代码。

表格 1

namespace BankingSystem
{
    public partial class frmLogIn : Form
    {
        dbConnector newConnector;
        public frmLogIn()
        {
            InitializeComponent();
newConnector = new dbConnector(**pass str file path**);
            timerMain.Enabled = true;
            timerMain.Start();
}

        private void btnLogIn_Click(object sender, EventArgs e)
        {
            try
            {
                newConnector.CheckDetailsLogin(accountNumTextBox.Text, pinNumTextBox.Text);
                frmUserHome UserHome = new frmUserHome(newConnector.myBankAccount);
                MessageBox.Show("Success! Happy Banking!");
                UserHome.ShowDialog();
                
            }
            catch
            {
                MessageBox.Show("Failed - incorrect login details.");
            }
        }
    }
}

表格 2

namespace BankingSystem
{
    public partial class frmUserHome : Form
    { public BankAccount _bankAccount;
        public frmUserHome(BankAccount bankAccount)
        {
            InitializeComponent(); _bankAccount = bankAccount;
            tabMainForm.Appearance = TabAppearance.FlatButtons;
            tabMainForm.ItemSize = new Size(0, 1);
            tabMainForm.SizeMode = TabSizeMode.Fixed;
            timerMain.Enabled = true;
            timerMain.Start();
        }

        private void frmUserHome_Load(object sender, EventArgs e)
        {
            labelWelcome.Text = "Welcome "+ bankAccount.AccountHolder;

        }

推荐阅读