首页 > 解决方案 > datagridview 排序未正确完成

问题描述

我有一个 xml 文件 (XMLFile1.xml)。

我做了以下,但 datagridview 排序没有正确完成。

例如,我有这 5 行和 2 列:

ID 价值
1 前-
2 共同
3 -ly
4 -ing
5 后-

但是当我点击datagridview的标题时,排序的结果是:

ID 价值
1 前-
2 共同
4 -ing
3 -ly
5 后-
private void Form1_Load(object sender, EventArgs e)
{
    dataGridView1.ColumnCount = 2;
    dataGridView1.RowCount = 5;
    dataGridView1.Columns[0].Name = "Radif";
    dataGridView1.Columns[1].Name = "Root";
    dataGridView1.Columns[1].SortMode = DataGridViewColumnSortMode.Automatic;

    dataGridView1.AutoGenerateColumns = true;
    string myXMLfile = @"C:\Users\PC\Desktop\XMLFile1.xml";

    DataSet ds = new DataSet();
    ds.ReadXml(myXMLfile);
    DataTable dt = ds.Tables["XMLFile1"];
    for (int i = 0; i < dt.Rows.Count; i++)
    {

        dataGridView1.Rows[i].Cells[0].Value = dt.Rows[i][0].ToString();
        dataGridView1.Rows[i].Cells[1].Value = dt.Rows[i][1].ToString();
    }
}

编辑1:

XMLFile1.xml

<dataroot xmlns:od="urn:schemas-microsoft-com:officedata"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:noNamespaceSchemaLocation="XMLFile1.xsd" generated="2016-03-09T13:36:40">
  <XMLFile1>
    <Radif>1</Radif>
    <Root>before-</Root>
  </XMLFile1>
  <XMLFile1>
    <Radif>2</Radif>
    <Root>co-</Root>
  </XMLFile1>
  <XMLFile1>
    <Radif>3</Radif>
    <Root>-ly</Root>
  </XMLFile1>
  <XMLFile1>
    <Radif>4</Radif>
    <Root>-ing</Root>
  </XMLFile1>
  <XMLFile1>
    <Radif>5</Radif>
    <Root>after-</Root>
  </XMLFile1>
</dataroot>

我单击 datagridview 的第二列(根列)。

编辑2:

我添加了这段代码,但我的问题没有解决:

private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
    dataGridView1.Refresh();
    dataGridView1.ClearSelection();
    dataGridView1.CurrentCell = dataGridView1.Rows[0].Cells[0];
    dataGridView1.Rows[0].Selected = true;
}

编辑 3:

private void Form1_Load(object sender, EventArgs e)
{
   string myXMLfile = @"C:\Users\PC\Desktop\XMLFile1.xml";

    ds = new DataSet();
    ds.ReadXml(myXMLfile);
    dt = ds.Tables["XMLFile1"];
    dataGridView1.DataSource = dt;
}

我有一个用于向 XML 文件和 datagridview1 添加行的按钮。当我添加行时,最后一行(添加的行)参与排序,但我希望将新数据添加到 datagridview1 的末尾并通过单击 datagridview1 标题进行排序。

private void buttonAdd_Click(object sender, EventArgs e)
{
    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.Load(@"C:\Users\PC\Desktop\XMLFile1.xml");
    XmlNode newElem = xmlDoc.CreateNode(XmlNodeType.Element, "XMLFile1", null);
    XmlNode newElemRadif = xmlDoc.CreateElement("Radif");
    newElemRadif.InnerText = tbRaAdd.Text;
    newElem.AppendChild(newElemRadif);
    XmlNode newElemName = xmlDoc.CreateElement("Root");
    newElemName.InnerText = tbRoAdd.Text;
    newElem.AppendChild(newElemName);
    xmlDoc.DocumentElement.AppendChild(newElem);
    xmlDoc.Save(@"C:\Users\PC\Desktop\XMLFile1.xml");
        DataRow dr = dt.NewRow();
        dr["Radif"] = tbRaAdd.Text;
        dr["Root"] = tbRoAdd.Text;  
        dt.Rows.Add(dr);
}

编辑4:

我做了这些,我的问题得到了解决:

private void Form1_Load(object sender, EventArgs e)
{
    dataGridView1.ColumnCount = 2;
    dataGridView1.Columns[0].Name = "Radif";
    dataGridView1.Columns[1].Name = "Root";  
    string myXMLfile = @"C:\Users\PC\Desktop\XMLFile1.xml";
    ds = new DataSet();
    ds.ReadXml(myXMLfile);
    dt = ds.Tables["XMLFile1"];
    dataGridView1.RowCount = dt.Rows.Count + 1;
    for (int i = 0; i < dt.Rows.Count; i++)
    {

        dataGridView1.Rows[i].Cells[0].Value = dt.Rows[i][0].ToString();
        dataGridView1.Rows[i].Cells[1].Value = dt.Rows[i][1].ToString();
    }
}


private void buttonAdd_Click(object sender, EventArgs e)
{
    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.Load(@"C:\Users\PC\Desktop\XMLFile1.xml");
    XmlNode newElem = xmlDoc.CreateNode(XmlNodeType.Element, "XMLFile1", null);
    XmlNode newElemRadif = xmlDoc.CreateElement("Radif");
    newElemRadif.InnerText = tbRaAdd.Text;
    newElem.AppendChild(newElemRadif);
    XmlNode newElemName = xmlDoc.CreateElement("Root");
    newElemName.InnerText = tbRoAdd.Text;
    newElem.AppendChild(newElemName);
    xmlDoc.DocumentElement.AppendChild(newElem);
    xmlDoc.Save(@"C:\Users\PC\Desktop\XMLFile1.xml");
    dataGridView1.Rows.Add(1);
    dataGridView1.Rows[dataGridView1.Rows.Count - 2].Cells[0].Value = tbRaAdd.Text;
    dataGridView1.Rows[dataGridView1.Rows.Count - 2].Cells[1].Value = tbRoAdd.Text;
}

标签: c#sortingdatagridview

解决方案


问题是RowCount包含新记录行,用户可以在其中输入新数据。最后一个带有“after-”的数据行添加到该行,但该行始终显示为最后一行。

因此,将 gridview 中的行数指定为比数据行数高 1。然后,您可以通过指定隐藏这个额外的行dataGridView1.AllowUserToAddRows = false;

首先将 XML 文件读入数据表,然后设置

dataGridView1.RowCount = dt.Rows.Count + 1;

但是,如果您只是将数据表分配给 gridview 的数据源,则可以大大简化您的代码。这会自动创建列和行。默认情况下,排序模式是自动的。

private void Form1_Load(object sender, EventArgs e)
{
    string myXMLfile = @"C:\Users\PC\Desktop\XMLFile1.xml";
    DataSet ds = new DataSet();
    ds.ReadXml(myXMLfile);
    DataTable dt = ds.Tables["XMLFile1"];
    dataGridView1.DataSource = dt;
}

作为对您的 EDIT 3 的回应,我建议采用完全不同的解决方案。我已经尝试过使用 DataSet,但遇到了很多问题。因此,我建议将 XML 读入自定义对象列表。

让我们为此创建一个类:

class XMLFile1
{
    public int? Radif { get; set; }
    public string Root { get; set; }
}

现在,我们在表单中声明两个字段并重写Form1_Load如下:

private XDocument _xDoc;
private BindingList<XMLFile1> _bindingList;

private void Form1_Load(object sender, EventArgs e)
{
    string myXMLfile = @"C:\Users\PC\Desktop\XMLFile1.xml";

    _xDoc = XDocument.Load(myXMLfile);
    var records = _xDoc.Root.Elements()
        .Select(el => new XMLFile1 {
            Radif = Int32.Parse(el.Element("Radif").Value),
            Root = el.Element("Root").Value
        })
        .ToList();

    _bindingList = new BindingList<XMLFile1>(records);
    dataGridView1.DataSource = _bindingList;
}

现在您可以在 dataGridView1 中进行编辑,包括通过底线添加新记录。您不需要文本框来输入新数据。如果您仍想通过文本框输入新数据,您可以添加一个新条目,如下所示:

private void buttonAdd_Click(object sender, EventArgs e)
{
    _bindingList.Add(
        new XMLFile1 { Radif = Int32.Parse(tbRaAdd.Text), Root = tbRoAdd.Text });
}

请注意,这会自动更新 dataGridView1。这也反过来起作用。在网格中所做的所有编辑都会自动保存到_bindingList. 因此,我们现在可以使用以下命令保存所有编辑:

private void btnSave_Click(object sender, EventArgs e)
{
    string myXMLfile = @"C:\Users\PC\Desktop\XMLFile1.xml";

    dataGridView1.EndEdit();

    var root = _xDoc.Root;
    root.RemoveNodes();
    root.Add(_bindingList.Select(x => new XElement("XMLFile1",
        new XElement("Radif", x.Radif),
        new XElement("Root", x.Root))));

    _xDoc.Save(myXMLfile);
}

推荐阅读