0

複数のフォーム間で変数を共有しようとしましたが、成功しませんでした。私は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 を他のすべてのフォームと共有したいと考えています。私は本当にこれを続ける必要があるので、アドバイスしてください。助けてくれてありがとう。

4

3 に答える 3

1

これを行う正しい方法は、フォームを使用して情報を取得し、必要に応じてアクセスできるように別の場所に保存することです。他の場所からフォームで直接アクセスしないでください。これには、アプリケーションのライフサイクル全体の範囲内にログイン フォームを保持する必要があります。これはおそらくあなたが望むものではありません。

実際には、これはGlobal、すべてがアクセスできる静的クラスのようなものを作成することを意味します。

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

ログインフォームから、ログインが正しいことを確認した後、次のようにします。

Globals.AccountNumber = txtBoxAcctNo.Text;

次に、AccountNumber が必要な場所であればどこでも、としてアクセスできますGlobals.AccountNumber

于 2013-03-05T11:37:29.767 に答える
1

その accountNo プロパティを静的にすることも、それにアクセスするための getter メソッドを使用することもできます。

accountNo を静的に設定すると、ClassName.PropertyName を呼び出すだけでアクセスできます。LoginScreen.accountNo はアカウント番号プロパティになります。

簡単なコード サンプル

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

public class AnotherClass
{
    string accountNo = LoginScreen.accountNo;
}
于 2013-03-05T11:31:45.657 に答える
0

あなたが望むものを達成するための3つの方法のいずれかをお勧めします。

  1. 変数を作成accountNopublic staticます。次に、他のフォームからアクセスできますLoginScreen.accountNo(可視性を制御するプロパティを用意することをお勧めします)。これは、 のアクティブなインスタンスが多数ありLoginScreen、それらすべてが accountNo を更新する可能性があり、このフィールドにアクセスするフォームで最新の値を取得する必要がある場合に適した方法です。
  2. フォーム全体にシングルトン パターンを実装し、変数accountNoとして保持します。publicこれは、会社のインスタンスを常に 1 つだけアクティブにする場合に適した方法です。
  3. 別のクラスのメンバーであり、によってアクセスできaccountNoます。これは、他のフォーム/クラスがフィールドを更新する可能性がある場合、および/またはこのフォームに関連付けるべきではないフィールドである場合に適した方法です。staticLoginScreenUtilClass.accountNo
于 2013-03-05T11:39:15.967 に答える