English 中文(简体)
C# 中表格2中的表单2中的表单1中函数
原标题:call Function in Form1 from Form2 in c#

i 在 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 中的按钮_ 点击事件中调用它? 这在 VB. NET 中有些简单 。

最佳回答

C# 中也简单。 您只需要一个 < code> 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();
        }
    }
}

请注意,该方法现在是 stistic , 这意味着不需要使用实例。 (这就像VB中的 shared 关键字。 ) 因此,您的表格可以调用 :

var students = StudentRepository.GetStudents();

您想要修正的另一件事是返回类型。 object 不是非常具体。 您应该有一个 Student 类, 并且该方法应该返回 Iliist< 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();
        }
    }
}

我对字段的类型做了一些假设, 如果错误的话, 您应该能够纠正这些类型 。 您甚至可能想要它返回一个 IIenumberable< students> , 而不是 liliist< student> , 如果它是一个不变的结果( 也就是说, 如果它只是学生的点数而不是要添加、 删除的列表) 。

您可以在这里做更多的工作,例如为其他数据元素(例如 Class (可能需要一个不同的名称,只是为了清理)、 Parent , Stream , >, Stream >,等等(想想看,其中一些可能需要更好的名称。你的变量命名一般需要做一点工作。诸如 Form1 myVivo1 之类的东西并不能很好地表达意向。 )

问题回答

您需要给您的 Form2 实例引用 Form1 实例, 这样一来, 它会和 a form1. GetStu students () 一样简单。

如果 Form1 是您的主要表格, 您可以简单地做

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

然而,这个代码中有几个部分 释放出一个坏代码的气味:

  • Database code inside a Form (it s not the form s responsibility really)
  • Method that returns object instead of an IList
  • Not clear what ApplicationContext.MainForm is without context (corollary: don t do this)

IMHO,你应该借此机会重新构思你现有的代码,使之符合可接受的做法。

我还没有和 C# 合作过, 但是它应该和 VB. Net 类似, 因为 VB. Net 仍然在同一个框架上。 您是否尝试过将您的函数放入一个分离的资源文件, 并将其添加到工程中? 您之所以不能调用该函数, 似乎是因为它们的形式不同, 造成范围问题。 资源文件应该解决这个问题, 并且它往往使代码更容易保存, 因为它会减少混乱 。





相关问题
Bring window to foreground after Mutex fails

I was wondering if someone can tell me what would be the best way to bring my application to the foreground if a mutex was not able to be created for a new instance. E.g.: Application X is running ...

How to start WinForm app minimized to tray?

I ve successfully created an app that minimizes to the tray using a NotifyIcon. When the form is manually closed it is successfully hidden from the desktop, taskbar, and alt-tab. The problem occurs ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

Handle DataTable.DataRow cell change event

I have a DataTable that has several DataColumns and DataRow. Now i would like to handle an event when cell of this DataRow is changed. How to do this in c#?

Apparent Memory Leak in DataGridView

How do you force a DataGridView to release its reference to a bound DataSet? We have a rather large dataset being displayed in a DataGridView and noticed that resources were not being freed after the ...

ALT Key Shortcuts Hidden

I am using VS2008 and creating forms. By default, the underscore of the character in a textbox when using an ampersand is not shown when I run the application. ex. "&Goto Here" is not ...

WPF-XAML window in Winforms Application

I have a Winforms application coded in VS C# 2008 and want to insert a WPF window into the window pane of Winforms application. Could you explain me how this is done.