2012-05-21 85 views
0

我在Form1中具有以下函數,並且想在單擊Form2中的按鈕時調用它。從Form2 Form1中調用函數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中,我如何從Form2中的button_Click事件調用它。這在VB.NET中很簡單

+0

您在某處是否有'Form1'類型的變量?它在C#和VB.Net中大致相同。 – Botz3000

+0

這是一顆寶石!結合您的問題,這是混合表示層和我長期見過的業務邏輯的最好例子。給你一個正確的答案:你爲什麼不把數據檢索代碼放到它自己的類中?在這種情況下,這兩種形式都可以在沒有您即將推出的交叉依賴的情況下使用它。 –

+0

@Thorsten Dittmar:除了它的寶石之外,你怎麼簡單地完成我所問的? ----假設這是一個快速演示,代碼將被重構! – StackTrace

回答

2

它在C#中也很簡單。您只需要Form1的實例,然後您可以在該實例中調用此方法。

但是,還有更好的方法。此代碼實際上並不是所屬的表單上的。表單用於UI交互,而不用於業務邏輯和數據訪問。你最好將這些代碼移到一個可以通過這兩種形式訪問的公共位置。

創建一個數據訪問類。事情是這樣的:

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,這意味着它並不需要一個實例來調用。 (這就好比在VB中Shared關鍵字)。所以你的形式可以只要致電:

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對象(這可能需要一個不同的名稱,只是要清潔),ParentStream等(細想它們中的一些可能需要更好的名稱,一般而言,您的變量命名需要一些工作,例如Form1myView1並不能很好地表達意圖。)

+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,因爲它仍然在同一個框架上。你有沒有試過把你的函數放在一個單獨的資源文件中並將其添加到項目中?看起來你無法調用這個函數的原因是由於它們存在一個範圍問題,因爲它們有不同的形式。資源文件應該考慮到這一點,並且它會使代碼更容易維護,因爲它可以減少混亂。