Member 13051404 Ответов: 1

Фильтр datagridview с текстовым полем без использования SQL и источника данных (если это возможно)


Привет всем, у меня есть этот код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication12
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            
            DataGridViewImageColumn dgvImageColumn = new DataGridViewImageColumn();
          
            dgvImageColumn.HeaderText = "Image";
            dgvImageColumn.ImageLayout = DataGridViewImageCellLayout.Stretch;
            DataGridViewTextBoxColumn dgvIdColumn = new DataGridViewTextBoxColumn();
            dgvIdColumn.HeaderText = "Id";

            dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;

            dataGridView1.RowTemplate.Height = 130;

            dataGridView1.AllowUserToAddRows = false;

            
           
            dataGridView1.Columns.Add(dgvIdColumn);
            dataGridView1.Columns.Add(dgvImageColumn);

       
            Image img1;
            img1 = Image.FromFile(@"C:\test1.jpg");
            dataGridView1.Rows.Add("test1", img1);

            Image img2;
            img2 = Image.FromFile(@"C:\test2.jpg");
            dataGridView1.Rows.Add("test2", img2);

            Image img3;
            img3 = Image.FromFile(@"C:\test3.jpg");
            dataGridView1.Rows.Add("test3", img3);
        }

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            MemoryStream ms = new MemoryStream();
            Bitmap img = (Bitmap)dataGridView1.CurrentRow.Cells[1].Value;
            img.Save(ms, ImageFormat.Jpeg);
            pictureBox1.Image = Image.FromStream(ms);
        }

        private void textBoxId_TextChanged(object sender, EventArgs e)
 {

    }
    }
}

По форме у меня есть:
- Datagridview (без источника данных, этот загружается только из кода Form_Load)
- Текстовое поле (в этом мне нужно сделать фильтр для объекта datagridview я установила, что, когда в результате фильтрации показывают только одно colum в элементе управления datagridview, если это возможно, чтобы показать correspective картину того результата, как от серии название животного, после завершения фильтрации и управления datagridview только одна строка показали, то correspective картина показала, тоже в элемент управления PictureBox])
- A Picturebox (этот загружает автоматическую картинку соответствующей строки, как я уже говорил, мне нравится показывать правильную картинку после фильтрации)

Что я уже пробовал:

Какой-то код из другого проекта (адаптированный к этому), но никто не работал

CHill60

Вы вводите идентификатор в текстовое поле, например "test1", "test2" или "test3", и ожидаете, что все остальные строки в DGV "исчезнут"?

Member 13051404

Да, это правильно, чтобы идентифицировать только 1 результат с искомым текстом

1 Ответов

Рейтинг:
2

CHill60

Вы можете использовать свойство Visible каждой строки для "фильтрации" DGV.
Например, вы можете иметь этот код под кнопкой "поиск" или в textBox1_Validated событие

          if(string.IsNullOrEmpty(textBox1.Text)) return;
foreach (DataGridViewRow r in dataGridView1.Rows)
{
    r.Visible = true;
    if (r.Cells[0].Value.ToString() != textBox1.Text)
        r.Visible = false;
    else
        pictureBox1.Image = (Image) r.Cells[1].Value;
}


Member 13051404

Я попробовал ваш код и вставить в раздел textboxId_textChanged, но когда я запустите программу и начните вводить все данные объекта datagridview исчезают только имя столбца остаются, я пробовал с базой данных (удалена часть добавить код со строки.добавить функции, и добавили базу как происхождение объекта datagridview, но дает мне ошибку на R.видна=ложь невозможно сделать невидимым, но я думаю, это из-за базы данных)

CHill60

А-извини. Когда ваша форма загружается, должно сработать событие textboxId_textChanged. Однако текстовое поле должно быть пустым, поэтому код должен был только что выйти из метода. Поставьте точку останова на этой линии, чтобы вы могли видеть, что происходит.
Что касается проблем visible=false, то вы явно сказали, что не используете базу данных и загружаете DGV в form_load. Вы не можете смешивать и сопоставлять код, если не знаете, что он или вы делаете.

Member 13051404

Я изменил свой код теперь я пытаюсь с помощью listview, можно ли добавить изображения (в частности, каждое из них к каждому элементу списка) только из кода ?
Теперь у меня есть это
Элементы = новый список(){
new Data () { Id =1, Name = "A", / / добавление какого-то изображения ?},
новые данные () { Id =2, Name = " B"},
новые данные () { Id =3, Name = " C"}

CHill60

Ну, это совсем другой вопрос! Взгляните на эту статью CP: ListView с изображением на подпунктах[^]