从c#中的Form2调用Form1中的函数

时间:2012-05-21 13:19:49

标签: .net winforms c#-4.0

我在Form1中有以下功能,并且想要在单击Form2中的按钮时调用它。

   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中很简单

3 个答案:

答案 0 :(得分:2)

您需要为Form2实例提供对Form1实例的引用,此时它就像form1.GetStudents()一样简单。

如果Form1是您的主要表单,您可以直接执行

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

但是,这段代码有几个部分会散发出糟糕的代码气味:

  • Form内的数据库代码(真的不是表格的责任)
  • 返回object而不是IList
  • 的方法
  • 不清楚ApplicationContext.MainForm没有上下文(推论:不要这样做)

恕我直言,你应该借此机会重构你现有的代码,并使其与可接受的做法保持一致。

答案 1 :(得分: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(可能需要不同的名称,只是为了干净),Parent,{{ 1}}等等(想想看,其中一些可能需要更好的名称。你的变量命名通常需要一些工作。像StreamForm1之类的东西不能传达意图好。)

答案 2 :(得分:0)

我没有使用过C#但它应该与VB.Net类似,因为它仍然在同一个框架上。您是否尝试将功能放在单独的资源文件中并将其添加到项目中?似乎你无法调用该函数的原因是由于它们以不同的形式存在范围问题。资源文件应该照顾它,并且它往往使代码更容易维护,因为它减少了混乱