我无法弄清楚为什么会这样。我是初学者,但对我来说有一个实例的参考设置。我首先让类具有数组的大小,现在设置为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)
{
}
}
}
SalesmanClass.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;
}
答案 0 :(得分:4)
您在==
语句中使用if
运算符,这意味着如果销售员为空,请设置其名称。我相信你的意思是如果推销员不 null(!=
)。你的for循环中也会遇到index out of range
异常,所以我也在这里修复过。
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;
}
}
如果你 意味着该实例为null,那么你可能需要这样的东西:
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
推销员。您还可以看到我评论说我将您要访问的字段从Name
更改为name
,因为在您发布的课程中,没有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);
}
答案 1 :(得分:3)
请记住,这一行不会创建任何新的SalesmanClass对象,只有100个类型为SalesmanClass的引用。
SalesmanClass[] salesmen = new SalesmanClass[100];
我想你想要:
if (salesmen[i] == null)
{
salesmen[i] = new SalesmanClass();
salesmen[i].name = textBox6.Text;
break;
}
[编辑]
兰德打败了我。我建议您使用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();
答案 2 :(得分:0)
如果发生对象引用错误,请检查变量u pass是否正确匹配正确的索引,例如:如果使用Grid检查变量u是否正确指向网格索引。
int StudID =
Convert.ToInt32(editableItem.OwnerTableView.DataKeyValues[editableItem.ItemIndex]
["StudID"].ToString());