C# xml序列化后读取xml的问题
我想将对象列表保存为xml。我还使用gridView显示列表中的对象。我正在使用xml.serialization库。从xml保存是正常的,没有错误。加载文件后,对象显示在列表中,但我得到的错误索引超出范围。我找不到问题出在哪里 有一个错误: System.ArgumentOutOfRangeException:索引超出范围。必须为非负数且小于集合的大小。C# xml序列化后读取xml的问题,c#,xml,C#,Xml,我想将对象列表保存为xml。我还使用gridView显示列表中的对象。我正在使用xml.serialization库。从xml保存是正常的,没有错误。加载文件后,对象显示在列表中,但我得到的错误索引超出范围。我找不到问题出在哪里 有一个错误: System.ArgumentOutOfRangeException:索引超出范围。必须为非负数且小于集合的大小。 参数名称:索引 在System.Collections.ArrayList.get_项(Int32索引) 在System.Windows.F
参数名称:索引
在System.Collections.ArrayList.get_项(Int32索引)
在System.Windows.Forms.DataGridViewSelectedRowCollection.get_项(Int32索引)中 我的主要声明:
private Teams team1, team2;
DataTable tQues = new DataTable(), tAnsw = new DataTable();
List<Question> ques = new List<Question>(); private bool edQues = false;
private int quesSelected = -1;
List<Answers> answ = new List<Answers>(); private bool edAnsw = false;
private int answSelected = -1;
在这里,我从文件中加载对象列表
private void fMain_Load(object sender, EventArgs e)
{
if (File.Exists("Questions.xml"))
{
ques = Question.Load();
}
//add columns to ques
tQues.Columns.Add("id", typeof(int));
tQues.Columns.Add("intrebarea", typeof(String));
tQues.Columns.Add("maxPoints", typeof(int));
tQues.Columns.Add("played", typeof(String));
// add columns to answ
tAnsw.Columns.Add("id", typeof(int));
tAnsw.Columns.Add("questionid", typeof(int));
tAnsw.Columns.Add("teamid", typeof(int));
tAnsw.Columns.Add("text", typeof(String));
tAnsw.Columns.Add("points", typeof(int));
//open queries
OpenQues();
OpenAnsw();
}
在此处,我将对象加载到栅格:
private void OpenQues()
{
tQues.Clear();
foreach (Question i in ques)
{
tQues.Rows.Add(i.questionID, i.text, i.maxPoints, i.played ? "yes" : "no");
}
gridQuestions.DataSource = tQues;
gridQuestions.Columns[0].Visible = false;
}
这里是我有错误的地方(第70行):
在您的情况下,
gridQuestions.SelectedRows[0]。索引
等于-1,或者SelectedRows
为空,因为您尚未选择行请在第70行标记一条注释。我们看不到行号。当然gridQuestions。行[gridQuestions.SelectedRows[0]。索引]
等同于gridQuestions.SelectedRows[0]
。这就是失败的原因,因为在调用此操作的点上没有选定的行。更改为>=0:gridQuestions.rows.Count>0。DGV在添加列之前有-1行,在添加列之后有零行。因此,在添加行之前将调用settQuesSelected。您没有提供调用setQuesSelected的代码。通常,当这种情况发生时,构造函数中会调用一个事件,并且在将行添加到DGV之前运行该事件是正常的,因此您必须能够处理行等于-1和零的情况。为什么?函数setQuesSelected()未在formLoad中调用,而是在将对象加载到网格后调用。因此rowsCount大于0,而所选的问题不是-1。或者我不明白什么。查找异常消息-DataGridViewSelectedRowCollection
private void OpenQues()
{
tQues.Clear();
foreach (Question i in ques)
{
tQues.Rows.Add(i.questionID, i.text, i.maxPoints, i.played ? "yes" : "no");
}
gridQuestions.DataSource = tQues;
gridQuestions.Columns[0].Visible = false;
}
private void setQuesSelected()
{
if (gridQuestions.Rows.Count > 0)
foreach (Question i in ques)
{
/*70 line*/if (Convert.ToInt32(gridQuestions.Rows[gridQuestions.SelectedRows[0].Index].Cells[0].Value) == i.questionID)
{
quesSelected = ques.IndexOf(i);
break;
}
}
else
quesSelected = -1;
}