C# xml序列化后读取xml的问题

C# xml序列化后读取xml的问题,c#,xml,C#,Xml,我想将对象列表保存为xml。我还使用gridView显示列表中的对象。我正在使用xml.serialization库。从xml保存是正常的,没有错误。加载文件后,对象显示在列表中,但我得到的错误索引超出范围。我找不到问题出在哪里 有一个错误: System.ArgumentOutOfRangeException:索引超出范围。必须为非负数且小于集合的大小。 参数名称:索引 在System.Collections.ArrayList.get_项(Int32索引) 在System.Windows.F

我想将对象列表保存为xml。我还使用gridView显示列表中的对象。我正在使用xml.serialization库。从xml保存是正常的,没有错误。加载文件后,对象显示在列表中,但我得到的错误索引超出范围。我找不到问题出在哪里

有一个错误:

System.ArgumentOutOfRangeException:索引超出范围。必须为非负数且小于集合的大小。
参数名称:索引
在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;
}