c# - 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;
}
解决方案
问题是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);
}
推荐阅读
- python - 用重复值填补 Panda 数据框中的空白
- python - Python For 循环问卷
- amazon-web-services - Cognito 控制台上的“属性”在哪里?
- python - 通过`subprocess`将数据传递给`stdin`时`stdout`为空,但在手动输入输入时包含预期的输出?
- c - 使用 stb_image 在 c 中将灰度转换为 2D 矩阵
- sql - SQL查询以获取课程名称以及mac分数和学生姓名
- python - 如何将多个整数/字符串与项目相关联
- c# - CefSharp.WinForms 两次呈现我的页面
- snowflake-cloud-data-platform - 如何在雪花中获取作业参数
- survival - 在 tmerge 数据帧的聚类分析中是否有可能使用时变协变量来竞争风险?