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

4

3 回答 3

2

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

如果Form1是你的主要形式,你可以简单地做

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

然而,这段代码有几个部分会散发出不好的代码气味:

  • a 中的数据库代码Form(实际上不是表单的责任)
  • 返回object而不是返回的方法IList
  • 不清楚什么ApplicationContext.MainForm是没有上下文的(推论:不要这样做)

恕我直言,您应该借此机会重构现有代码并使其符合可接受的做法。

于 2012-05-21T13:23:12.700 回答
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,这意味着它不需要调用实例。(这就像SharedVB 中的关键字。)所以您的表单可以调用:

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();
        }
    }
}

我对字段的类型做了一些假设,如果它们错了,你应该能够纠正它们。您甚至可能希望它返回 anIEnumerable<Student>而不是IList<Student>如果它是不变的结果(也就是说,如果它只是学生的枚举而不是要添加、删除等的列表)。

您可以在这里做更多的事情,例如为其他数据元素创建一个对象,例如Class(可能需要一个不同的名称,只是为了干净)Parent、、、Stream等等。(想想看,其中几个可能需要更好的名称。您的变量命名通常需要一些工作。类似Form1myView1不能很好地传达意图的事情。)

于 2012-05-21T13:30:22.700 回答
0

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

于 2012-05-21T13:23:59.490 回答