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

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

この質問の範囲外ですが、修正したいもう1つのことは、その戻り型です。 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、これらのいくつかには必要な場合があります)より良い名前。一般に、変数の名前付けには少し作業が必要です。意図がうまく伝わらない、Form1または伝わらないなどです。)myView1

于 2012-05-21T13:30:22.700 に答える
2

Form2インスタンスにインスタンスへの参照を与える必要がありますForm1。その時点で、それはform1.GetStudents().

Form1あなたのメインフォームであれば、あなたは簡単に行うことができます

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

ただし、このコードには、コードの悪臭を放つ部分がいくつかあります。

  • 内部のデータベース コードForm(実際にはフォームの責任ではありません)
  • objectの代わりに返すメソッドIList
  • コンテキストがないと何が明確でないかApplicationContext.MainForm(結果: 実行しないでください)

私見では、この機会に既存のコードをリファクタリングし、許容される慣行に沿ったものにする必要があります。

于 2012-05-21T13:23:12.700 に答える
0

私は C# を使ったことはありませんが、同じフレームワーク上にあるので、VB.Net に似ているはずです。関数を別のリソース ファイルに入れてプロジェクトに追加しようとしましたか? 関数を呼び出すことができない理由は、それらが異なる形式であることによるスコープの問題が原因のようです。リソースファイルはそれを処理する必要があり、混乱が減るため、コードの保守がはるかに簡単になる傾向があります

于 2012-05-21T13:23:59.490 に答える