2009-11-30 65 views
2

您好我有DataGridView控件,我manyally與項目(無數據源)查找DataGridView的項目(行)的標籤

 int row = dgvClients.Rows.Add(); 
     dgvClients.Rows[row].Cells["ClientObjectID"].Value = somevalue1; 
     dgvClients.Rows[row].Cells["ClientCode"].Value = somevalue2; 
     dgvClients.Rows[row].Tag = SomeObject1; 

請注意填寫,在GridView的每一行代表的一些對象,並其標籤被設置爲特定對象。只有一行可以將Tag引用給一個SomeObject。沒有重複。

現在我需要找到datagridview ROW引用SomeObject。什麼是最好的方法?

+0

讓我澄清。我有一些表和用戶可以輸入文字來查找項目。我需要選擇包含所需文本的行。我想知道是否有一些「模式」。我不想直接迭代並檢查 – 2009-11-30 19:08:59

+0

因此,可搜索的文本是在標記中,而不是在其他列中? – John 2009-11-30 19:11:47

+0

標記是指具有某些屬性(字符串)的某些類 datagridview列代表所有這些屬性,而 行代表某些類的不同實例。用戶輸入 文本並說明它是哪個屬性(列)。我需要找到正確的行並選擇它。 – 2009-11-30 19:16:46

回答

3

這是我放在一起,可能會做你所描述的東西。它是快速和骯髒的,但它可能會讓你去:

我有一個空白的DataGridView,一個組合框和一個窗體上的文本框。 TestObject是一個具有3個字符串屬性的對象,用於本示例的測試目的。

爲了方便起見,我用TestObject的幾個實例初始化一個通用列表。然後我手動添加3列到datagridview對應於TestObject的3個屬性。然後,我遍歷列表並手動將它們添加到datagridview,並將對象實際存儲在Row的標籤屬性中。

然後,我使用datagridview中列的引用來填充組合框。用戶將選擇他/她想要搜索的列,然後在文本框中鍵入要匹配的文本。

然後,我處理textbox textchanged事件,以基於組合框中選定的列和文本框中的文本來搜索datagridview。對於更大的數據集,您不希望處理textchanged事件,因爲在每次更改字母后搜索都太慢。

沒有使用數據表或數據源,我想不出任何簡單的方法來搜索行而不進行迭代。我不知道你的要求,但我會用一個綁定源和一個列表,或者至少設置一個數據表。使用綁定源,您也可以應用過濾器並動態顯示符合搜索條件的結果。

using System; 
using System.Collections.Generic; 
using System.Windows.Forms; 

namespace WindowsFormsApplication2 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 

      List<TestObject> objects = new List<TestObject> 
       { 
         new TestObject("1", "object1", "first"), 
         new TestObject("2", "object2", "nada"), 
         new TestObject("3", "object3", "Hello World!"), 
         new TestObject("4", "object4", "last") 
       }; 

      dataGridView1.Columns.Add("ColID", "ID"); 
      dataGridView1.Columns.Add("ColName", "Name"); 
      dataGridView1.Columns.Add("ColInfo", "Info"); 

      foreach (TestObject testObject in objects) 
      { 
       int row = dataGridView1.Rows.Add(); 
       dataGridView1.Rows[row].Cells["ColID"].Value = testObject.ID; 
       dataGridView1.Rows[row].Cells["ColName"].Value = testObject.Name; 
       dataGridView1.Rows[row].Cells["ColInfo"].Value = testObject.Info; 
       dataGridView1.Rows[row].Tag = testObject; 
      } 

      foreach (DataGridViewColumn col in dataGridView1.Columns) 
      { 
       comboBox1.Items.Add(col); 
      } 

      comboBox1.ValueMember = "HeaderText"; 
      comboBox1.SelectedIndex = 0; 
     } 

     private void textBox1_TextChanged(object sender, EventArgs e) 
     { 
      dataGridView1.ClearSelection(); 
      foreach (DataGridViewRow row in dataGridView1.Rows) 
      { 

       if (row.Cells[((DataGridViewColumn)comboBox1.SelectedItem).Name].Value == null) 
       { 
        continue; 
       } 
       if (row.Cells[((DataGridViewColumn)comboBox1.SelectedItem).Name].Value.ToString().Equals(
         textBox1.Text,StringComparison.InvariantCultureIgnoreCase)) 
       { 
        row.Selected = true; 
        return; 
       } 
      } 
     } 
    } 
} 

public class TestObject 
{ 
    public TestObject(string id, string name, string info) 
    { 
     ID = id; 
     Name = name; 
     Info = info; 
    } 

    public string ID { get; set; } 
    public string Info { get; set; } 
    public string Name { get; set; } 
} 
1

您可以使用LINQ並將結果設置爲datagridview數據源。這樣你所需要做的就是運行LINQ,將它綁定到datagridview,然後刷新它。

在VB中我將它作爲代碼這樣:

dim results = from obj in objects _ 
       where obj.<property> = <value> _ 
       select obj 

datagridview1.datasource = results.tolist() 
datagridview1.refresh() 

如果沒有其他人有更好的答案來了我今晚將創建一個測試項目,給你實用的C#代碼。

Wade

+0

任何方式在2.0中做到這一點? – karlipoppins 2010-04-04 18:51:55

+0

是的,LINQ只不過是擴展方法。看看這個相關的帖子 - http://stackoverflow.com/questions/2138/linq-on-the-net-2-0-runtime – Wade73 2010-04-05 12:23:05

+0

這將是很好,如果你投票我的答案添加評論來解釋爲什麼。沒有它,我將如何改進? – Wade73 2012-12-19 14:16:26