2010-12-03 6 views
0

ich eine Funktion wie diese in einer Klasse definiert haben:Kontrollen werden nicht von anderen Klasse geerbt

using System; 
using System.Collections.Generic; 

using System.Linq; 
using System.Text; 

using System.Data; 
using System.Data.SqlClient; 

using System.Windows.Forms; 
using System.Configuration; 
using System.Diagnostics; 
using MFDBAnalyser; 

namespace MFDBAnalyser 

{ 

    public class DataAccessMaster:MFDBAnalyser 

    { 


     //  /// <summary> 
     //  /// This function gets the list of all the databases present in the local server. 
     //  /// </summary> 
     //  /// <returns></returns> 


     public static DataSet GetAllDataBaseNames() 

     { 

      SqlConnectionStringBuilder objConnectionString = new SqlConnectionStringBuilder(); 
      objConnectionString.DataSource = txtHost.Text; 
      objConnectionString.UserID = txtUsername.Text; 
      objConnectionString.Password = txtPassword.Text; 

      SqlConnection sConnection = new SqlConnection(objConnectionString.ConnectionString); 

      //If connected then give this message to user 
      lblMessage.Visible = true; 
      lblMessage.Text = "You are connected to the SQL Server...."; 

      try 
      { 
       //To Open the connection. 
       sConnection.Open(); 

       //Query to select the list of databases. 
       string selectDatabaseNames = @"SELECT 
                NAME 
               FROM 
                [MASTER]..[SYSDATABASES]"; 

       //Create the command object 
       SqlCommand sCommand = new SqlCommand(selectDatabaseNames, sConnection); 

       //Create the data set 
       DataSet sDataset = new DataSet("master..sysdatabases"); 

       //Create the dataadapter object 
       SqlDataAdapter sDataAdapter = new SqlDataAdapter(selectDatabaseNames, sConnection); 
       sDataAdapter.TableMappings.Add("Table", "master..sysdatabases"); 

       //Fill the dataset 
       sDataAdapter.Fill(sDataset); 

       //Bind the database names in combobox 
       DataViewManager dsv = sDataset.DefaultViewManager; 

      } 
      catch(Exception ex) 
      { 
       //All the exceptions are handled and written in the EventLog. 
       EventLog logException = new EventLog("Application"); 
       logException.Source = "MFDBAnalyser"; 
       logException.WriteEntry(ex.Message); 
       MessageBox.Show("Login Failed!!", "Error Occured"); 
      } 
      finally 
      { 
       //If connection is not closed then close the connection 
       if(sConnection.State != ConnectionState.Closed) 
       { 
        sConnection.Close(); 
       } 
      } 
     } 
    } 
} 

Und dann rief ich diese Funktion in einer anderen Klasse wie folgt aus:

public void BindDBDropDown() 

     { 

DataSet dsTablesWithoutForeignKeys = default(DataSet); 

      try 
      { 
       //The function GetAllForeignKeyTables() is called from the class PluginManager. 
       dsTablesWithoutForeignKeys = DataAccessMaster.GetAllDataBaseNames(); 

       cmbDatabases.DisplayMember = "TABLE_NAME"; 
       cmbDatabases.ValueMember = ""; 
       cmbDatabases.DataSource = dsTablesWithoutForeignKeys.Tables["master..sysdatabases"]; 
      } 
      catch(Exception ex) 
      { 
       //All the exceptions are handled and written in the EventLog. 
       EventLog logException = new EventLog("Application"); 
       logException.Source = "MFDBAnalyser"; 
       logException.WriteEntry(ex.Message); 
      } 
     } 

Aber es gibt zeigt einen Fehler wie txtHost etx existiert nicht und wenn ich den geschützten Modifizierer von designer.cs Klasse zu public ändern, dann zeigt es auch Fehler ...

C jemand sagt mir, was passiert?

Antwort

1

Unter der Annahme, dass Ihre Textfelder in der Klasse MFDBAnyser definiert sind, können Sie in der Funktion GetAllDataBaseNames immer noch nicht darauf zugreifen. GetAllDataBaseNames ist eine statische Funktion und daher nicht in der Lage, auf Instanzvariablen wie die Textfelder oder andere Steuerelemente zuzugreifen.

0

Überprüfen Sie, ob der Modifikator von txtHost ebenfalls geschützt oder öffentlich ist.

0

U kann die Werte für ein Formular in einer anderen Klasse nicht abrufen. Probieren Sie die Parameter aus. Oder verwenden Sie properties {get ;set;}, um auf die Werte zuzugreifen. Ich denke, dass Sie eine Eigenschaft verwenden und den Wert der Textbox zuweisen können. Wenn Sie in winforms tun, ist es okay, dass Sie statische Variablen verwenden können. Aber im Fall von Web müssen Sie Argumente übergeben.

Verwandte Themen