2013-03-05 50 views
0

我一直在試圖在沒有成功的情況下在多個表單之間共享一個變量。我很新的C#等已經閱讀儘管幾個關於它的東西..下面慘遭失敗是程序代碼:用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。請告知,因爲我真的需要繼續這個。感謝您的任何幫助。

+0

此表單是否啓動您想要與其共享該值的其他表單? – 2013-03-05 11:28:58

+0

在LoginScreen中定義一個'public static'字段/屬性,並通過'LoginScreen.AccountNo'從其他表單訪問它。 – Sinatr 2013-03-05 11:29:11

+1

@KD,這是一個Windows窗體應用程序,而不是一個網站。 – 2013-03-05 11:30:17

回答

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; 
} 
+0

如果您需要從LoginScreen窗體中獲取該值,並使其可用於其餘表格 在文本更改後首先打開,您可以設置值
accountNo = textBox1.Text; 然後你可以訪問它。 – Roshana 2013-03-05 11:42:09

1

去對此正確的方法是使用表單來檢索信息,然後將它保存在別處被訪問,你需要它。不要直接從別處的表單訪問它 - 這將要求您將登錄表單保留在整個應用程序生命週期的範圍內。這可能不是你想要的。

在實踐中,這意味着像Global靜態類,一切都可以訪問創造一些:

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

從你的登錄表單,驗證登錄是正確的之後,你會簡單地做:

Globals.AccountNumber = txtBoxAcctNo.Text; 

然後,在其他任何地方你需要AccountNumber,你可以將它作爲Globals.AccountNumber來訪問。

+1

您需要閱讀[屬性](http://msdn.microsoft.com/en-gb/library/x9fsa0sw(v = vs.80).aspx) – DGibbs 2013-03-05 11:43:52

+0

上面的'get'和'set'定義了AccountNumber作爲財產。你可以把它看作一個變量,只有更好。看看http://stackoverflow.com/questions/4142867/what-is-difference-between-property-and-variable-in-c-sharp – Tass 2013-03-05 11:46:25

+0

我的第一個代碼塊是所有你需要在globals.cs文件 - 在命名空間塊內。第二塊是您登錄表單中唯一需要的額外代碼。您可以在應用程序的任何位置設置和訪問「Globals.AccountNumber」。 – Tass 2013-03-05 20:02:49

0

我可以推薦以下三種方式之一來實現你想要什麼:

  1. accountNo一個public static變量。然後,其他表單可以通過LoginScreen.accountNo訪問它(最好有一個屬性來控制可見性)。如果您可能有許多LoginScreen的活動實例,並且它們都可能更新accountNo並且您想要訪問此字段以獲取最新值的任何表單,則這是一種很好的方法。
  2. 爲整個表單實現一個單例模式,並將accountNo作爲public變量。如果您在任何時候只有一個公司實例活躍,這是一個很好的方法。
  3. accountNostatic另一類中的成員,並且LoginScreenUtilClass.accountNo訪問。如果其他表單/類可能需要更新字段和/或它不應與此表單關聯的字段,則這是一種好方法。