使用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。请给我建议,因为我真的需要继续做下去。谢谢你的帮助。
您可以将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
访问。
我可以推荐三种方法中的一种来实现您想要的:
- 将
accountNo
设为public static
变量。然后,其他表单可以通过LoginScreen.accountNo
访问它(最好有一个属性来控制可见性(。如果您可能有许多LoginScreen
的活动实例,并且它们都可能更新accountNo,并且您希望任何访问此字段的表单都能获得最新值,那么这是一个很好的方法 - 为整个表单实现一个singleton模式,并将
accountNo
作为public
变量。如果你在任何时候都只有一个活跃的公司实例,这是一个很好的方法 - 让
accountNo
成为另一个类中的static
成员,并让LoginScreen
通过UtilClass.accountNo
访问它。如果其他表单/类可能想要更新该字段和/或该字段不应该与此表单关联,那么这是一个很好的方法