Найти элемент (строку) DataGridView по тегу - PullRequest
2 голосов
/ 30 ноября 2009

Привет, у меня есть элемент управления 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 установлен для конкретного объекта. Только одна строка может иметь ссылку Tag на один SomeObject. Нет дубликатов.

Теперь мне нужно найти Rag в datagridview со ссылкой на SomeObject. Какой самый лучший способ?

Ответы [ 2 ]

3 голосов
/ 02 декабря 2009

Вот кое-что, что я собрал, чтобы сделать то, что вы описываете. Это быстро и грязно, но это может помочь вам:

У меня есть пустой DataGridView, поле со списком и текстовое поле на форме. TestObject - это класс, который является объектом с 3 строковыми свойствами для целей тестирования этого примера.

Для простоты я инициализирую общий список несколькими экземплярами TestObject. Затем я вручную добавляю 3 столбца в представление данных, которые соответствуют 3 свойствам TestObject. Затем я перебираю список и вручную добавляю их в сетку данных, а также сохраняю объект в свойстве тега строки.

Затем я заполняю комбинированный список ссылками на столбцы в сетке данных. Пользователь выберет столбец, который он / она хочет найти, а затем введите текст для соответствия в текстовом поле.

Затем я обрабатываю событие textaged textbox для поиска сетки данных на основе столбца, выбранного в выпадающем списке, и текста в текстовом поле. Для большего набора данных вы не захотите обрабатывать событие с измененным текстом, потому что оно будет слишком медленным для поиска после каждого изменения буквы.

Без использования источника данных или источника данных я не могу придумать простого способа поиска строк без итерации. Я не знаю ваших требований, но я бы использовал источник связывания со списком или настроил бы как минимум таблицу данных. С источником привязки вы также можете применить фильтр и динамически показывать только те результаты, которые соответствуют вашему поиску.

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 голос
/ 30 ноября 2009

Вы можете использовать LINQ и установить результаты в качестве источника данных сетки данных. Таким образом, все, что вам нужно сделать, это запустить LINQ, связать его с сеткой данных и затем обновить его.

В VB я бы написал так:

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

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

Если никто не придет с лучшим ответом, сегодня вечером я создам тестовый проект, чтобы дать вам практический код C #.

Wade

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...