【问题标题】:Sharing data across forms with C# [duplicate]使用 C# 跨表单共享数据 [重复]
【发布时间】:2013-03-05 11:25:35
【问题描述】:

我一直在尝试在多个表单之间共享一个变量,但没有成功。我对 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。请告知,因为我真的需要继续这样做。感谢您的帮助。

【问题讨论】:

  • 此表单是否会启动您想与之共享该价值的其他表单?
  • 在 LoginScreen 中定义一个 public static 字段/属性,并通过 LoginScreen.AccountNo 从其他表单访问它。
  • @KD,这是一个 Windows 窗体应用程序,而不是一个网站。

标签: c# database winforms variables


【解决方案1】:

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

如果您将 accountNo 设置为静态,您只需调用即可访问它 类名.属性名 在你的情况下 LoginScreen.accountNo 将是帐号属性。

简单代码示例

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

public class AnotherClass
{
    string accountNo = LoginScreen.accountNo;
}

【讨论】:

  • 如果您需要从 LoginScreen 表单中获取值并使其可用于其余表单首先 - 在文本更改后您可以设置值 accountNo = textBox1.Text;然后你就可以访问它了。
【解决方案2】:

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

实际上,这意味着创建类似Global 静态类的东西,所有东西都可以访问:

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

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

Globals.AccountNumber = txtBoxAcctNo.Text;

然后,在您需要 AccountNumber 的其他任何地方,您都可以通过 Globals.AccountNumber 访问它。

【讨论】:

  • 你需要阅读Properties
  • 上面的getset 将AccountNumber 定义为一个属性。你可以把它想象成一个变量,只会更好。看看stackoverflow.com/questions/4142867/…
  • 我的第一个代码块就是你在 globals.cs 文件中所需要的——在命名空间块中。第二个块是登录表单中唯一需要的额外代码。您可以在应用程序的任何位置设置和访问Globals.AccountNumber
  • 这个答案如果包含合法的 C# 代码会更有用。特别是,AccountNumber 属性需要声明为 static 本身,因为否则它不能通过类型名称访问,并且因为类本身被声明为 static(即非静态属性不是甚至允许)。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-17
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    相关资源
    最近更新 更多