使用C#跨表单共享数据

本文关键字:共享 数据 表单 使用 | 更新日期: 2023-09-27 18:02:12

我一直在尝试在多个表单之间共享一个变量,但没有成功。我对c#很陌生,所以尽管读了一些关于它的东西,但一直失败得很惨。下面是程序代码:

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;
using System.Data.Common;
using System.Data.OleDb;    
namespace login
{
    public partial class LoginScreen : Form
    {
        public LoginScreen()
        {
            InitializeComponent();
        }
        // Variables
        int count = 0;
        public static System.Data.OleDb.OleDbConnection con = 
                new System.Data.OleDb.OleDbConnection();//database connection
        string dbProvider;
        string dbSource;
        OleDbDataAdapter da; // create database adapter 'da'
        // CREATE DATASET VARIABLE ds1 TO HOLD THE DATABASE 
        public static DataSet ds1 = new DataSet();
        string accountNo;
        string sql;
        string password;
        int rownum = 0;
        bool valid = false;
        private void btnLogin_Click(object sender, EventArgs e)
        {
            accountNo = txtBoxAccntNo.Text;
            valid = validate();  //uses validate() method to check validity 
            if (valid == true && accountNo == "11111111")
            {
                ManagerScreen Manager = new ManagerScreen();
                this.Hide();
                Manager.Show();
            }
            else if (valid == true)
            {
                s customer = new s();
                this.Hide();
                customer.Show();
            }
            else
            {
                if (count == 2)
                {
                    this.Close();
                }
                count += 1;
                txtBoxAccntNo.Clear();
                txtBoxPinNo.Clear();
            }
        }
        private void txtBoxAccntNo_TextChanged(object sender, EventArgs e)
        {
        }
        private void LoginScreen_Load(object sender, EventArgs e)
        {   
            // open database connection and load contents 
            // database connection
            dbProvider = "PROVIDER=Microsoft.ACE.OLEDB.12.0;"; // this is the database provider
            dbSource = "Data Source = 'C:''Bank.accdb'"; // navigation path
            con.ConnectionString = dbProvider + dbSource;         
        }
        private void btnExit_Click(object sender, EventArgs e)
        {
            // If button exit selected hide this form and open the welcome screen
            WelcomeForm Welcome = new WelcomeForm();
            this.Hide();
            Welcome.Show();
        }
        // IsValid method checks that pass and login are valid 
        private bool validate()
        {
            ds1 = new DataSet();
            con.Open();
            // Validate Account number
            sql = "SELECT * FROM tblCustomers WHERE ((tblCustomers.AccountNo) = '" + txtBoxAccntNo.Text + "')";
            da = new OleDbDataAdapter(sql, con);
            rownum = da.Fill(ds1, "tblCustomers");
            con.Close();

            if (rownum != 1)
            {
                MessageBox.Show("Not a valid Account number! - Try Again ");
                return false;
            }
            else
            {
                // validate the pin
                password = ds1.Tables["tblCustomers"].Rows[0][4].ToString();
                if (password == txtBoxPinNo.Text)
                {
                    MessageBox.Show("valid");
                    return true;
                }
                else
                {
                    MessageBox.Show("Not a valid password - please try again ");
                    return false;
                }
            }
        }           
    }
}

我想与所有其他表单共享变量accountNo。请给我建议,因为我真的需要继续做下去。谢谢你的帮助。

使用C#跨表单共享数据

您可以将accountNo属性设置为静态属性,也可以使用一些getter方法来访问它。

如果您将accountNo设置为静态,则只需调用类名.属性名就你而言LoginScreen.accountNo将是帐号属性。

简单代码示例

public partial class LoginScreen : Form
{
    public LoginScreen()
    {
        InitializeComponent();
    }
    public static string accountNo;
}
public class AnotherClass
{
    string accountNo = LoginScreen.accountNo;
}

正确的方法是使用表单检索信息,然后将其存储在其他地方,以便根据需要进行访问。不要从其他地方直接访问表单中的信息-这将要求您在整个应用程序生命周期内保持登录表单的作用域。这可能不是你想要的。

在实践中,这意味着创建一个Global静态类,所有东西都可以访问:

public static class Globals {
    public static string AccountNumber {
        get;
        set;
    }
}

在您的登录表单中,验证登录正确后,您只需执行以下操作:

Globals.AccountNumber = txtBoxAcctNo.Text;

然后,在任何其他需要AccountNumber的地方,都可以将其作为Globals.AccountNumber访问。

我可以推荐三种方法中的一种来实现您想要的:

  1. accountNo设为public static变量。然后,其他表单可以通过LoginScreen.accountNo访问它(最好有一个属性来控制可见性(。如果您可能有许多LoginScreen的活动实例,并且它们都可能更新accountNo,并且您希望任何访问此字段的表单都能获得最新值,那么这是一个很好的方法
  2. 为整个表单实现一个singleton模式,并将accountNo作为public变量。如果你在任何时候都只有一个活跃的公司实例,这是一个很好的方法
  3. accountNo成为另一个类中的static成员,并让LoginScreen通过UtilClass.accountNo访问它。如果其他表单/类可能想要更新该字段和/或该字段不应该与此表单关联,那么这是一个很好的方法