Необработанное исключение типа ‘System.Data.Исключение EvaluateException’ произошло в System.Data.dll Дополнительная информация: Не удается найти столбец [Имя]

#c# #csv

#c# #csv

Вопрос:

Я хотел создать простое окно поиска из текстового поля в Visual Studio, где вы будете вводить определенную букву или ключевое слово, чтобы вы могли искать / фильтровать существующий контракт из .csv.

И затем он будет отображаться в dataGridView1. Я проанализировал файл .csv и создал из него источник данных под названием «tbl».

Теперь каждый раз, когда я что-то ввожу в свой txtBoxSearch, появляется эта ошибка.

Необработанное исключение типа ‘System.Data.Исключение EvaluateException’ произошло в System.Data.dll

Дополнительная информация: не удается найти столбец [Имя]

Это части, связанные с ошибкой

 private void txtBoxSearch_TextChanged(object sender, EventArgs e)
{
    DataView DV = new DataView(tbl);
    DV.RowFilter = string.Format("Approved Contracts LIKE '%{0}%'", txtBoxSearch.Text);
    dataGridView1.DataSource = DV;
}
 

Вот где ошибка ->

 DV.RowFilter = string.Format("Approved Contracts LIKE '%{0}%'", txtBoxSearch.Text);
 

Вот мой полный код.

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;




namespace Contract_Management_System
{
    public partial class frmMain : Form
    {
        DataTable tbl = new DataTable();
        string file = "Approved.csv";
        int colNum = 10;
        DataSet dataset;


        public frmMain()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            string[] lines = System.IO.File.ReadAllLines(file);
            string[] data_col = null;
            int x = 0;

            foreach (string line in lines)
            {
                data_col = line.Split(',');

                if (x == 0)
                {
                    //header
                    for (int i = 0; i <= data_col.Count() - 1; i  )
                    {
                        tbl.Columns.Add(data_col[i]);
                    }
                    x  ;
                }
                else
                {
                    //data
                    tbl.Rows.Add(data_col);
                }
            }
            dataGridView1.DataSource = tbl;

            DataGridViewButtonColumn createButtonColumn = new DataGridViewButtonColumn();
            createButtonColumn.Name = "Create Contract";
            createButtonColumn.Text = "Create";
            int columnIndex = 2;

            if (dataGridView1.Columns["Create Contract"] == null)
            {
                dataGridView1.Columns.Insert(columnIndex, createButtonColumn);
            }

            dataGridView1.CellClick  = dataFromBAC_CellClick;

        }

        private void dataFromBAC_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == dataGridView1.Columns["Create Contract"].Index)
            {
                //MessageBox.Show("Create!");
                //dataFromBAC.Rows.RemoveAt(this.dataFromBAC.SelectedRows[0].Index);
            }
        }

        private void txtBoxSearch_TextChanged(object sender, EventArgs e)
        {
            DataView DV = new DataView(tbl);
            DV.RowFilter = string.Format("Name LIKE '%{0}%'", txtBoxSearch.Text);
            dataGridView1.DataSource = DV;
        }

        private void btnFromBAC_Click(object sender, EventArgs e)
        {
            fromBAC form2 = new fromBAC();
            form2.Visible = true;
        }

        private void btnPending_Click(object sender, EventArgs e)
        {
            Pending form4 = new Pending();
            form4.Visible = true;
        }

        private void btnEndNotif_Click(object sender, EventArgs e)
        {
            End form3 = new End();
            form3.Visible = true;
        }

        private void btnFromAMO_Click(object sender, EventArgs e)
        {
            fromAMO form5 = new fromAMO();
            form5.Visible = true;
        }

        private void btnSearch_Click(object sender, EventArgs e)
        {

        }

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }
    }
}
 

Ответ №1:

Ваш блок «полный код» отличается от вашего образца — он имеет:

 DV.RowFilter = string.Format("Name LIKE '%{0}%'", txtBoxSearch.Text);
 

Который соответствует исключению

 Additional information: Cannot find column [Name]
 

Столбец с именем ‘Name’ был бы только в том случае, если бы в csv был столбец с заголовком ‘Name’. Я бы посоветовал просмотреть csv и подтвердить заголовки там. Кроме того, выполните журнал отладки или дамп имен столбцов по мере их добавления — вы можете обнаружить, что они добавляются с кавычками или пробелами, поэтому фактическое имя столбца в таблице данных равно ["Name"] или [Name ]

Если вы собираетесь фильтровать по столбцу, вызываемому Approved Contracts с пробелом в нем, ваша фактическая строка фильтра должна быть:

 DV.RowFilter = string.Format("[Approved Contracts] LIKE '%{0}%'", txtBoxSearch.Text);
 

Комментарии:

1. О, извините за это! Я забыл отредактировать это, так как одновременно редактировал свой код.

2. Спасибо! Это сработало, большое вам спасибо за помощь, я застрял на этом около часа.