2012-10-23 155 views
0

我不断收到此错误,我知道为什么,但我需要帮助了解如何解决它。唯一能够添加我的项目来创建新表单但看起来很傻的方法。如何添加项目到我的ListView

,如果我做我的所有方法静态它不会工作=(

我不断收到,

“的对象引用需要非静态字段,方法或 财产“Handicap_Calculator .FormMain.listViewLog” \ Form1.cs中74 13盘口计算器”

Here's我的代码:

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

    } 

} 
} 

编辑...

这里是类IM从调用它:

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

Winforms? WPF?如果WPF那么为什么你不使用DataBinding类型ScoreInfo的集合?尽管Winforms也提供DataBinding到数据源。你可能需要看看。 – HichemSeeSharp

回答

2

简单的解决方案是定义你的方法AddScoreAddToList非静态的。

public void AddScore() 
{ 
    //your code 
} 

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

如果你想使用静态方法,你应该窗体的实例传递给方法,在要项添加到ListView。

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

如果我删除静态然后我不能调用我的其他类 – badtoy1986

+0

@ badtoy1986的方法:如果更新我的答案,但然后你需要传递你的表单的实例作为参数的静态方法。 – Jehof

+0

更新时间更多信息 – badtoy1986