0

このエラーが何度も発生し、その理由はわかっていますが、解決方法を見つけるために助けが必要です。アイテムを追加して新しいフォームを作成できる唯一の方法ですが、それはばかげているようです。

すべてのメソッドを静的にすると機能しません =(

私は取得し続けます、

「非静的フィールド、メソッド、またはプロパティ 'Handicap_Calculator.FormMain.listViewLog' \Form1.cs 74 13 Handicap Calculator にはオブジェクト参照が必要です」

これが私のコードです:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Handicap_Calculator
{

public partial class FormMain : Form
{
    //FormAddScore FormAddNewScore = new FormAddScore();
    public static bool addScoreIsShown = false;
    public static FormAddScore _FormAddScore;
    public static ListViewItem Item;
    //public static List<string> ScoreInfo = new List<string>();

    public FormMain()
    {
        InitializeComponent();

    }

    public void button1_Click(object sender, EventArgs e)
    {
        try
        {
            if (_FormAddScore == null || _FormAddScore.IsDisposed)
            {
                _FormAddScore = new FormAddScore();
            }
            _FormAddScore.Show();
            if (_FormAddScore.WindowState == FormWindowState.Minimized)
            {
                _FormAddScore.WindowState = FormWindowState.Normal;
            }
            _FormAddScore.BringToFront();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }

    public static void AddScore()
    {
        int Round = 1;
        DateTime date = _FormAddScore.date;
        string course = _FormAddScore.course;
        int holes = _FormAddScore.holes;
        int score = _FormAddScore.score;
        float courseRating = _FormAddScore.courseRating;
        float slopeRating = _FormAddScore.slopeRating;

        string[] ScoreInfo = new string[7];
        ScoreInfo[0] = Round.ToString();
        ScoreInfo[1] = date.ToString();
        ScoreInfo[2] = course;
        ScoreInfo[3] = holes.ToString();
        ScoreInfo[4] = score.ToString();
        ScoreInfo[5] = courseRating.ToString();
        ScoreInfo[6] = slopeRating.ToString();
        AddToList(ScoreInfo);

    }

    public static void AddToList(string[] ScoreInfo)
    {
        Item = new ListViewItem(ScoreInfo);            
        //listViewLog.Items.Add(Item);      

    }

}
}

編集...

ここから呼び出しているクラスは次のとおりです。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Handicap_Calculator
{

public partial class FormAddScore : Form
{
    public DateTime date;
    public string course;
    public int holes;
    public int score;
    public float courseRating;
    public float slopeRating;

    public FormAddScore()
    {
        InitializeComponent();

    }

    private void FormAddScore_FormClosing(object sender, FormClosingEventArgs e)
    {
        FormMain.addScoreIsShown = false;
    }

    public void  getscore()
    {
        try
        {
            date = dateTimePicker1.Value;
            course = textBoxCourse.Text;
            holes = Convert.ToInt16(textBoxHoles.Text);
            score = Convert.ToInt16(textBoxScore.Text);
            courseRating = Convert.ToSingle(textBoxCourseRating.Text);
            slopeRating = Convert.ToSingle(textBoxSlopeRating.Text);
        }
        catch(Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        getscore();            
        FormMain.AddScore();
    }
}
}
4

1 に答える 1

2

AddScore簡単な解決策は、メソッドをAddToList非静的として定義することです。

public void AddScore()
{
    //your code
}

public void AddToList(string[] ScoreInfo)
{
    // your code
}

静的メソッドを使用する場合は、ListView にアイテムを追加するメソッドに Form のインスタンスを渡す必要があります。

public static void AddScore(FormMain mainForm)
{
    //your code
    AddToList(mainForm, ScoreInfo);
}

public static void AddToList(FormMain mainForm, string[] ScoreInfo)
{
    // your code
}

アップデート:

更新されたコードによると、解決策は、作成時に FormMain のインスタンスを FormAddScore に渡すことです。FormAddScore では、メソッドを呼び出す FormMain インスタンスへの参照を格納します。

public partial class FormAddScore : Form
{
  // your code

  private FormMain _mainForm;

  public FormAddScore(){
    InitializeComponent();

  }

  public FormAddScore(FormMain mainForm) : this(){
    _mainForm = mainForm;
  }

FormMain で FormAddScore のインスタンスを作成するときは、FormMain のインスタンスを期待するコンストラクターを使用する必要があります

 _FormAddScore = new FormAddScore(this);

このセットアップでは、変数 _mainForm に格納された参照を使用して、メソッドを非静的に変更し、FormAddScore で FormMain のメソッドを呼び出すことができます。

 _mainForm.AddScore();
于 2012-10-23T06:32:03.427 に答える