1

我不明白为什么这种情况不断发生。我是初学者,但对我来说有一个实例的参考集。起初我很难让类有一个现在设置为 100 的数组的大小

这是我的代码。

Form1.cs

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 WindowsFormsApplication1
{
public partial class Form1 : Form
{

    SalesmanClass[] salesmen = new SalesmanClass[100];


    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {

        if (textBox6.Text.Trim().Length != 0)
        {


            for (int i = 0; i <= salesmen.Length; i++)
            {

                if (salesmen[i] == null)
                {
                    salesmen[i].name = textBox6.Text; // error happens here when i enter something into the form it says
                    //Object reference not set to an instance of an object error
                    break;

                }

            }

        }
        else
        {
            MessageBox.Show("Please Input a Name");
        }

    }

    private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
    {

    }

    private void button2_Click(object sender, EventArgs e)
    {
        List<string> names = new List<string>();

        for (int i = 0; i < salesmen.Length; i++)//var salesmen in salesmen)
        {
            names.Add(salesmen[i].Name);// same problem here
        }
        listBox1.Items.Add(names);

    }

    private void textBox6_TextChanged(object sender, EventArgs e)
    {

    }

    private void button2_Click_1(object sender, EventArgs e)
    {

    }
}
}

推销员类.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WindowsFormsApplication1
{
public class SalesmanClass
{

    public string name;
    public string cNum;
    public string Email;
    public string address;
    public string gArea;
    public int tSales;

    public SalesmanClass()
    {
        name = null;
        cNum = null;
        Email = null;
        address = null;
        gArea = null;


    }
4

3 回答 3

4

您在语句中使用==运算符if,这意味着如果推销员为空,则设置其名称。我相信你的意思是如果推销员为空(!=)。你也会index out of range在你的 for 循环中遇到一个异常,所以我也在这里修复了它。

for (int i = 0; i < salesmen.Length; i++)
{

    if (salesmen[i] != null)
    {
        salesmen[i].name = textBox6.Text; // error happens here when i enter something into the form it says
        //Object reference not set to an instance of an object error
        break;

    }

}

如果你的意思是那个实例为空,也许你想要这样的东西:

for (int i = 0; i < salesmen.Length; i++)
{

    if (salesmen[i] == null)
    {
        salesmen[i] = new SalesmanClass();
        salesmen[i].name = textBox6.Text; // error happens here when i enter something into the form it says
        //Object reference not set to an instance of an object error
        break;

    }

}

在您的button2_Click方法中,您遇到了同样的问题,因为您没有跳过null推销员。您还可以看到我评论说我将您正在访问的字段更改为Namename因为在您发布的课程中,没有Name字段。

private void button2_Click(object sender, EventArgs e)
{
    List<string> names = new List<string>();

    for (int i = 0; i < salesmen.Length; i++)//var salesmen in salesmen)
    {
        if (salesmen[i] != null)
        {
            names.Add(salesmen[i].name); // changed from .Name to .name
        }
    }
    listBox1.Items.Add(names);

}
于 2013-05-20T06:18:22.953 回答
3

请记住,这一行不会创建任何新的 SalesmanClass 对象,只有 100 个 SalesmanClass 类型的引用。

SalesmanClass[] salesmen = new SalesmanClass[100];

我想你想要:

if (salesmen[i] == null)
{
    salesmen[i] = new SalesmanClass();
    salesmen[i].name = textBox6.Text;
    break;
}

[编辑] 兰德打败了我。我建议您使用 a List,您不必担心“空白点”

List<Salesman>() salesmen = new List<Salesman>();

然后简单地替换您的for loop代码:

if (textBox6.Text.Trim().Length != 0)
{
    salesmen.Add(new Salesmane() { name = textBox6.Text } );
}
else
{
    MessageBox.Show("Please Input a Name");
}

你在List<string> names.

您可能必须在属性上声明 getter 和 setter:

public string Name { get; set; }

我也会将这些属性命名为 CamelCase,因为这是公认的标准。

您需要更新您的 button2_click 以使用Count而不是Length或使用foreach循环:

foreach (Salesman salesman in salesmen)
{
names.Add(salesman.Name);
}

您还可以使用 LINQ 来简化,这完全一样:

List<string> names = salesmen.Select(s => s.Name).ToList();
于 2013-05-20T06:26:53.890 回答
0

如果发生对象引用错误,请检查您传递的变量是否正确匹配正确的索引,例如:如果您使用网格,请检查您访问的变量是否正确指向网格的索引。

int StudID = 
Convert.ToInt32(editableItem.OwnerTableView.DataKeyValues[editableItem.ItemIndex]
["StudID"].ToString());
于 2014-01-02T12:09:44.497 回答