数据网格行过滤 return 小于
Data grid row filter return less than
当我 运行 过滤我的 xml 文件时,它 return 所有行甚至高于给定数量的行。
DataSet ds = new DataSet();
ds.ReadXml("Database.xml");
string filter = "";
filter = "Dayvisited <= '20'";
DataView dv = new DataView(ds.Tables[0]);
dv.RowFilter = filter;
dataGridView2.DataSource = dv;
dataGridView2.Columns[4].Visible = false;
这是我的 xml
<root>
<place>
<Name />
<Location />
<Info />
<Dayvisited />
<userdata />
</place>
<place>
<Name>home</Name>
<Location>x-292 z 277</Location>
<Info>home</Info>
<Dayvisited>100</Dayvisited>
<userdata>u</userdata>
</place>
<place>
<Name>base</Name>
<Location>x868 z986</Location>
<Info>stuff</Info>
<Dayvisited>20</Dayvisited>
<userdata>u</userdata>
</place>
<place>
<Name>town</Name>
<Location>x 990 z-2485</Location>
<Info>gas station</Info>
<Dayvisited>12</Dayvisited>
<userdata>u</userdata>
</place>
<place>
<Name>crossing</Name>
<Location>x 90 z-2998</Location>
<Info>working stiff</Info>
<Dayvisited>11</Dayvisited>
<userdata>u</userdata>
</place>
<place>
<Name>home</Name>
<Location>x-280 z 277</Location>
<Info>home and more stuff</Info>
<Dayvisited>125</Dayvisited>
<userdata>u</userdata>
</place>
</root>
我怎样才能让 return 只有 Dayvisited 少于 20 的那些到数据网格?。我认为使用文本框作为值会让人感到困惑,所以我将其更改为仅使用 20,但它仍然如此,我不知道为什么。
我如何将用户输入添加到文件中
try
{
DataRow dr = ds.Tables[0].NewRow();
dr["Name"] = Nametb.Text;
dr["Location"] = Locationtb.Text;
dr["Info"] = Infotb.Text;
dr["Dayvisited"] = dayvisitcb.Text;
dr["userdata"] = "u";
ds.Tables[0].Rows.Add(dr);
ds.WriteXml("Database.xml");
}
catch (Exception)
{
throw;
}
基本问题是您将 DayVisited
的值作为字符串读取。因此,在字符串比较中,"100" < "20"
的比较结果为真。这导致该行被包含在结果中。
为了正确比较值,必须先将其转换为整数:
filter = "Convert(Dayvisited, System.Int32) <= 20"
但是,由于您的 XML 文件包含一行开头没有 DayVisited
的数据,因此您必须为无效数据做好准备。因此,您必须在排除无效行之前检查字符串的长度:
filter = "IIF(LEN(DayVisited) = 0, FALSE, Convert(Dayvisited, System.Int32) <= 20)"
如果要在结果中包含空行,请将 FALSE
更改为 TRUE
。
当我 运行 过滤我的 xml 文件时,它 return 所有行甚至高于给定数量的行。
DataSet ds = new DataSet();
ds.ReadXml("Database.xml");
string filter = "";
filter = "Dayvisited <= '20'";
DataView dv = new DataView(ds.Tables[0]);
dv.RowFilter = filter;
dataGridView2.DataSource = dv;
dataGridView2.Columns[4].Visible = false;
这是我的 xml
<root>
<place>
<Name />
<Location />
<Info />
<Dayvisited />
<userdata />
</place>
<place>
<Name>home</Name>
<Location>x-292 z 277</Location>
<Info>home</Info>
<Dayvisited>100</Dayvisited>
<userdata>u</userdata>
</place>
<place>
<Name>base</Name>
<Location>x868 z986</Location>
<Info>stuff</Info>
<Dayvisited>20</Dayvisited>
<userdata>u</userdata>
</place>
<place>
<Name>town</Name>
<Location>x 990 z-2485</Location>
<Info>gas station</Info>
<Dayvisited>12</Dayvisited>
<userdata>u</userdata>
</place>
<place>
<Name>crossing</Name>
<Location>x 90 z-2998</Location>
<Info>working stiff</Info>
<Dayvisited>11</Dayvisited>
<userdata>u</userdata>
</place>
<place>
<Name>home</Name>
<Location>x-280 z 277</Location>
<Info>home and more stuff</Info>
<Dayvisited>125</Dayvisited>
<userdata>u</userdata>
</place>
</root>
我怎样才能让 return 只有 Dayvisited 少于 20 的那些到数据网格?。我认为使用文本框作为值会让人感到困惑,所以我将其更改为仅使用 20,但它仍然如此,我不知道为什么。
我如何将用户输入添加到文件中
try
{
DataRow dr = ds.Tables[0].NewRow();
dr["Name"] = Nametb.Text;
dr["Location"] = Locationtb.Text;
dr["Info"] = Infotb.Text;
dr["Dayvisited"] = dayvisitcb.Text;
dr["userdata"] = "u";
ds.Tables[0].Rows.Add(dr);
ds.WriteXml("Database.xml");
}
catch (Exception)
{
throw;
}
基本问题是您将 DayVisited
的值作为字符串读取。因此,在字符串比较中,"100" < "20"
的比较结果为真。这导致该行被包含在结果中。
为了正确比较值,必须先将其转换为整数:
filter = "Convert(Dayvisited, System.Int32) <= 20"
但是,由于您的 XML 文件包含一行开头没有 DayVisited
的数据,因此您必须为无效数据做好准备。因此,您必须在排除无效行之前检查字符串的长度:
filter = "IIF(LEN(DayVisited) = 0, FALSE, Convert(Dayvisited, System.Int32) <= 20)"
如果要在结果中包含空行,请将 FALSE
更改为 TRUE
。