2017-07-26 110 views
0

我應該只採取一些項目。過濾器等於DataGridView中的元素

Excel文件的模式如下:

<ConfigRegolatori> 
<Id>6</Id> 
<Address>92</Address> 
<Category>90</Category> 
<Mode>TC_K</Mode> 
<Model>Z4TC</Model> 
<Name>KT6</Name> 

<ConfigRegolatori> 
<Id>7</Id> 
<Address>7</Address> 
<Category>100</Category> 
<Mode>TC_K</Mode> 
<Model>M9_Servo</Model> 
<Name>KT7</Name> 

<ConfigRegolatori> 
<Id>8</Id> 
<Address>92</Address> 
<Category>90</Category> 
<Mode>TC_K</Mode> 
<Model>Z4TC</Model> 
<Name>KT10</Name> 

的代碼部分如下

dtConfReg = new DataTable(); 
dtConfReg.ReadXml(Principale.strPathConfig + "\\ConfigRegulators.xml"); 
dtConfReg.TableName = "ConfigReg"; 

bsouReg = new BindingSource(); 
bsouReg.DataSource = dtConfReg; 
dgvwConfigReg.DataSource = bsouReg; 

因爲我有在地址字段中的值相同的多個行,我想獲得每個值都有一行。例如,我有92個地址標記的多個記錄,我只想提取一個。

PS:一個重要的信息是,我使用的框架2.0

感謝

+0

爲什麼不在讀取xml之後,在設置'DataSource'並將沒有多個記錄的修改列表設置爲'DataContext'之前,不要這樣做? –

+0

請嘗試以下操作:DataTable newTable = dtConfReg.AsEnumerable()。GroupBy(x => x.Field (「Address」))。Select(x => x.FirstOrDefault())。CopyToDataTable(); – jdweng

+0

在DataSource分配之後無法完成割縫,必須在分配到網格之前在Linq中過濾數據 –

回答

0

您可以使用DataTableDefaultView財產。

dtConfReg.DefaultView.RowFilter = "Address = '92'"; 

完整的解決方案是:

dtConfReg = new DataTable(); 
dtConfReg.ReadXml(Principale.strPathConfig + "\\ConfigRegulators.xml"); 
dtConfReg.TableName = "ConfigReg"; 
dtConfReg.DefaultView.RowFilter = "Address = '92'"; 

bsouReg = new BindingSource(); 
bsouReg.DataSource = dtConfReg.DefaultView; 
dgvwConfigReg.DataSource = bsouReg; 

注意,過濾器使用單引號的值,如果從XML反序列化值INT不使用它們。

UPDATE

我已經改變了代碼由該地址進行過濾。如果您想通過某些列值過濾數據,此解決方案可以工作。

如果您想從該XML獲取不同的值,那麼我建議您先從XML獲取值,然後使用現有代碼將數據表綁定到UI控件。

+0

我試過你的解決方案,但它不會改變任何東西。 在大多數情況下,我解釋不好,因爲我想爲每個不同的地址採取標籤。 也就是說,如果我找到地址90,那麼我找到一個元素,如果我找到地址93,那麼我會接受這個元素,但是如果我再次遇到地址90,我不會接受它,因爲我先拿它。 – fede186

+0

對不起,但對C#沒有很豐富的經驗,而且對英語不太瞭解,我不明白你的最後一句話或我推薦使用的解決方案。 – fede186