2013-09-10 5 views
1

Сейчас у меня есть этот код в класс под названием вспомогательный класс:Как мне вызвать метод из класса Form?

class HelperClass : CollegeSystem.GUI 
    { 

     public void selectStudent() 
     { 
      MySqlConnection conn; // connection object; 
     string connstring = "server=localhost;user Id=root;database=collegesystem;Convert Zero Datetime=True "; 

      try 
      { 
       conn = new MySqlConnection(connstring); 
       conn.Open(); 
       MySqlCommand myCommand = new MySqlCommand("SELECT * FROM person", conn); 
       MySqlDataReader myReader; 
       myReader = myCommand.ExecuteReader(); 
       cmbTable.Items.Clear(); 
       while (myReader.Read()) 
       { 
        cmbTable.Items.Add(myReader["personID"] + " | " + myReader["firstName"] + " | " + myReader["lastName"] + " | " + myReader["address"] + " | " + myReader["phoneNumber"] + " | " + myReader["postCode"] + " | " + myReader["dateOfBirth"]); 
       } 
      } 

      catch (Exception err) 
      {//handle the error with a message 
       lblInfo.Text = " Error reading the database."; 
       lblInfo.Text += err.Message; ; 
      } 

      finally 
      { 

      } 

И я хотел бы назвать, что от моей формы, но он не работает:

private void fillcomboBox() 
{ 
    selectStudent(); 
} 

Название «selectStudent "не существует в текущем контексте

Я поместил это в верхней части формы:

public partial class GUI : Form, College_System.HelperClass 

Я что-то упустил?

PS. Почему бы cmbTable и lblInfo были недоступны из-за его уровня защиты? Спасибо.

+0

Возможно, 'HelperClass.selectStudent();'. –

+0

С этим «HelperClass» не существует в текущем контексте – user2469932

+1

Простите, что ваш класс 'HelperClass' наследует от' CollegeSystem.GUI' и 'GUI' от' College_System.HelperClass'? Правильно ли пространство имен 'College_System'? –

ответ

1

У вас есть несколько проблем с этим кодом.

  1. У вас есть метод класса и экземпляра, и вы вызываете метод напрямую. Вы должны создать экземпляр класса и вызвать метод.

  2. Проверьте, не определено ли определение класса и вызов в том же пространстве имен или нет. Если нет, вы должны определить класс как internal/public и включить пространство имен на странице вызывающего кода.

  3. Вы не можете получить доступ к этикетке, если они не определены в одном классе (помощник)

В общем, вспомогательных классах являются автономными классами, где вы передаете данные по своим методам и получить результат для обработки. Например, вы можете попробовать что-то вроде:

class myForm : Form 
{ 
    protected void OnClick() 
    { 
     try 
     { 
      var data = Helper.SelectStudent(); 
      cmbTable.Items.AddRange(data); 
     } 
     catch (Exception ex) 
     { 
      lblInfo.Text = " Error reading the database."; 
      lblInfo.Text += err.Message; ; 
     } 
    } 
} 

class HelperClass 
{ 
    public static List<string> SelectStudent() 
    { 
     List<string> data = new List<string>(); 
     MySqlConnection conn; // connection object; 
     string connstring = "server=localhost;user Id=root;database=collegesystem;Convert Zero Datetime=True "; 
     conn = new MySqlConnection(connstring); 
     conn.Open(); 
     MySqlCommand myCommand = new MySqlCommand("SELECT * FROM person", conn); 
     MySqlDataReader myReader; 
     myReader = myCommand.ExecuteReader(); 
     cmbTable.Items.Clear(); 
     while (myReader.Read()) 
     { 
      data.Add(myReader["personID"] + " | " + myReader["firstName"] + " | " + myReader["lastName"] + " | " + myReader["address"] + " | " + myReader["phoneNumber"] + " | " + myReader["postCode"] + " | " + myReader["dateOfBirth"]); 
     } 
     return data; 
    } 
} 
+0

'публичный статический DataTable SelectStudent() { попробовать { // ...} поймать (Exception) { бросок; } ' Я не понимаю, что я должен разместить там – user2469932

+0

connectionstring, datareader, while loop (которые создают datatable). Перед блокировкой catch вы должны вернуть данные, созданные через цикл while. Вы даже можете удалить блок try ... catch в SelectStudent как тот же доступный в OnClick. –

+0

'публичный статический DataTable SelectStudent()' почему бы, что выдаст ошибку 'не все пути кода возвращают value' тем, что я имею в виду' SelectStudent() ' – user2469932

1

По умолчанию атрибут является приватным. Если вы хотите использовать в Herited Классе вы можете выбор: общественный, защищенный conteneur, protectedinternal

В вашем случае я предлагаю общественности

public class HelperClass : CollegeSystem.GUI 
1

public partial class GUI : Form, College_System.HelperClass

вы не можете сделать это. Ваша линия

public partial class GUI : Form, College_System.HelperClass 

должен быть

public partial class GUI : Form 

, то вы можете назвать как

College_System.HelperClass c = new College_System.HelperClass(); 
c.selectStudent(); 
+0

ok ... так что с 'College_System.HelperClass.selectStudent();' Я не получаю ошибки, теперь моя ошибка по-прежнему недоступна и 'Ссылка на объект требуется для нестатического поля, метода или свойства' – user2469932

+0

Где эта ошибка появляется? Какая линия? – Arran

+0

, что происходит каждый раз, когда у меня есть 'cmbTable' или' lblInfo' – user2469932

Смежные вопросы