2012-05-21 12 views
0

У меня есть следующая функция в Form1 и вы хотите вызвать ее при нажатии кнопки в Form2.вызов функции в Form1 из формы2 в C#

public object GetStudents() 
    { 
     using (var DB = new myView1()) 
     { 
      var studentList = (from s in DB.View123 
          select new { s.StudentName, s.StudentNumber, s.ClassName, s.StreamName, s.ParentName }).ToList(); 
      dataGridViewStudents.DataSource = students; 
      return students.ToList(); 
     } 
    } 

Выше функции в Form1, как я называю это из события button_Click в Form2. Это что-то простое в VB.NET.

+0

У вас есть переменная типа 'Form1' где-нибудь? Это примерно то же самое в C# и VB.Net. – Botz3000

+0

Это драгоценный камень! В сочетании с вашим вопросом это лучший пример для смешения уровня представления и той бизнес-логики, которую я видел в течение длительного времени. Чтобы дать вам правильный ответ: почему бы вам не поместить код поиска данных в свой собственный класс? В этом случае обе формы могут использовать его без кросс-зависимостей, которые вы собираетесь ввести. –

+0

@Thorsten Dittmar: но, кроме того, что это за жемчужина, как вы просто выполняете то, что я спросил? ---- просто предположим, что это для быстрой демонстрации, и код будет реорганизован !! – StackTrace

ответ

2

Это также просто на C#. Вам просто нужен экземпляр Form1, а затем вы можете вызвать этот метод в этом экземпляре.

Однако есть лучший подход. Этот код фактически не принадлежит на форме. Формы предназначены для взаимодействия с пользовательским интерфейсом, а не для бизнес-логики и доступа к данным. Вам лучше переместить этот код в общее место, к которому будут доступны обе формы.

Создайте класс доступа к данным. Что-то вроде этого:

public class StudentRepository 
{ 
    public static object GetStudents() 
    { 
     using (var DB = new myView1()) 
     { 
      var studentList = (from s in DB.View123 
         select new { s.StudentName, s.StudentNumber, s.ClassName, s.StreamName, s.ParentName }).ToList(); 
      dataGridViewStudents.DataSource = students; 
      return students.ToList(); 
     } 
    } 
} 

Обратите также внимание, что метод теперь static, который означает, что он не нужен экземпляр будет называться. (Это как Shared ключевое слово в VB.) Так что ваши формы могут просто позвонить:

var students = StudentRepository.GetStudents(); 

Еще одна вещь, которую вы хотите исправить, хотя это выходит за рамки этого вопроса, является то, что тип возвращаемого значения. object не очень специфичен. У вас должен быть класс Student, и этот метод должен возвращать IList<Student>.Что-то вроде этого:

public class Student 
{ 
    public string StudentName { get; set; } 
    public int StudentNumber { get; set; } 
    public string ClassName { get; set; } 
    public string StreamName { get; set; } 
    public string ParentName { get; set; } 
} 

и:

public class StudentRepository 
{ 
    public static IList<Student> GetStudents() 
    { 
     using (var DB = new myView1()) 
     { 
      var studentList = (from s in DB.View123 
         select new Student { StudentName = s.StudentName, StudentNumber = s.StudentNumber, ClassName = s.ClassName, StreamName = s.StreamName, ParentName = s.ParentName }).ToList(); 
      dataGridViewStudents.DataSource = students; 
      return students.ToList(); 
     } 
    } 
} 

Я сделал несколько предположений о типах для полей, вы должны быть в состоянии исправить их, если они не правы. Возможно, вы захотите вернуть IEnumerable<Student> вместо IList<Student>, если это неизменный результат (то есть, если это просто перечисление студентов, а не список, который нужно добавить, удалить и т. Д.).

Там намного больше, вы можете сделать здесь, например, имеющие объект для элементов других данных, таких как Class (который, возможно, потребуется другое имя, просто быть чистыми), Parent, Stream и т.д. (Come думать это, возможно, потребует нескольких имен, для чего вам нужно иметь больше имен. Обычно вам требуется небольшое количество имен для переменных переменных. Такие вещи, как Form1 или myView1, не очень хорошо переносят намерения.)

+0

+1 для * Этот код на самом деле не принадлежит к форме. * –

2

Вы должны предоставить экземпляр Form2 ссылку на экземпляр Form1, и в этот момент было бы так же просто, как form1.GetStudents().

Если Form1 ваша основная формы вы могли бы просто сделать

var students = ((Form1)ApplicationContext.MainForm).GetStudents(); 

Однако, есть несколько частей с помощью этого кода, которые испускают плохой код запах:

  • код базы данных внутри Form (это не форма ответственности)
  • Метод, который возвращает object вместо IList
  • Не ясно, что ApplicationContext.MainForm без контекста (следствие: не делайте этого)

ИМХО вы должны воспользоваться этой возможностью, чтобы реорганизовать существующий код и привести его в соответствии с приемлемой практикой.

+0

Спасибо за совет, обязательно обязательно сделайте это – StackTrace

0

Я не работал с C#. Но он должен быть похож на VB.Net, так как он все еще находится на одной структуре. Вы пытались помещать свои функции в отдельный файл ресурсов и добавлять его в проект? Похоже, причина, по которой вы не можете вызвать функцию, связана с проблемой области, из которой они находятся в разных формах. Файлы ресурсов должны позаботиться об этом, и он имеет тенденцию делать код намного проще в обслуживании, так как он уменьшает беспорядок

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