DataSource имеет значение null, но был заполнен ранее - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть одна функция, заполняющая 5 DataGridView таким же образом, и другая функция, вызываемая, когда я изменяю значение текстового поля, чтобы упорядочить dgv в соответствии с текстом текстового поля

Каждый dgv имеет свое собственное текстовое поле, так чтоэто отдельные события "tbx.text_changed", все они вызывают мою функцию.

У меня также есть функция, сортирующая dgv по определенному столбцу, которая вызывается после того, как я заполнил dgv.Итак, по порядку, я заполняю dgv, затем упорядочиваю их по 3-му столбцу под названием Commentaires, затем ввожу некоторый текст, чтобы упорядочить их из 1-го столбца под названием Champ

Вчера я мог искать текст в каждом dgv, кроме одного.Я пытался исправить проблему, но сегодня я могу искать только в той, которая была ранее прослушена.

Каждый другой dgv выдает ошибку «нулевая ссылка», когда я ввожу букву в их текстовое поле.NullReference указывает, что источники данных пусты, однако они не должны быть.

Вчера для одинокого dgv была та же ошибка.

Вот моя функция для поиска текста:

       if (text == "")
            {
                lblTexte.Text = "";
                lblCompteur.Text = "";
                for (int i = 0; i < dgv.Rows.Count - 1; i++)
                {
                dgv.Rows[i].Selected = false;
            }
            return;
        }
        if (dgv.RowCount < 1)
        {
            return;
        }
        else
        {
            DataTable d = new DataTable();
            lblTexte.Text = "Champ répondant au critère: ";
            tbx.SelectionStart = text.Length;
            tbx.Text = text.ToUpper();
            if ((dgv.DataSource.GetType()).Equals(typeof(DataView)))
            {
                d = ((DataView)dgv.DataSource).Table;
            }
            else
            {
                d = dgv.DataSource as DataTable;
            }
            DataRow[] row = d.Select("Champ like '%" + text + "%'");
            List<int> listeIndex = new List<int>();
            for (int i = 0; i < dgv.Rows.Count - 1; i++)
            {
                foreach (DataRow r in row)
                {
                    if (((DataRowView)dgv.Rows[i].DataBoundItem).Row == r)
                    {
                        dgv.Rows[i].Selected = true;
                        listeIndex.Add(i);
                    }
                    else if (!listeIndex.Contains(i))
                    {
                        dgv.Rows[i].Selected = false;
                    }
                }

            }
        }
        if (dgv.SelectedRows.Count != 0)
        {
            dgv.FirstDisplayedScrollingRowIndex = dgv.SelectedRows[0].Index;
        }
        if (dgv.SelectedRows.Count == 0 && text == "")
        {
            lblCompteur.Text = "";
        }
        else
        {
            lblCompteur.Text = dgv.SelectedRows.Count.ToString();
        }

Вот моя функция для заполнения представлений данных:

BindingSource bs = new BindingSource();
        DataTable dt = new DataTable("source");
        if (source.Any())
        {
            //Creation datatable
            dt.Columns.Add("Champ", System.Type.GetType("System.String"));
            dt.Columns.Add("Valeur", System.Type.GetType("System.String"));
            dt.Columns.Add("Commentaires", System.Type.GetType("System.String"));
            foreach (Enregistrement enr in source)
            {
                dt.Rows.Add(new object[] { enr.cle, enr.valeur, ControleurTypes.verificationEnregistrement(enr) });
            }
            bs.DataSource = dt;
            grille.DataSource = bs;
            return dt;
        }
        return dt;

А вот моя функция для их сортировки:

BindingSource bs = (BindingSource)dgv.DataSource;
        DataTable dt = (DataTable)bs.DataSource;
        DataView view = dt.DefaultView;
        view.Sort = "Commentaires DESC";
        dgv.DataSource = view;

В конце концов, я не могуМне удалось отсортировать мои Datatables, я думаю, что это связано с какой-то проблемой преобразования.Ошибка возникает в функции, которую я использую для упорядочения таблиц данных с использованием текста текстового поля.

DataRow[] row = d.Select("Champ like '%" + text + "%'");

В этой строке выдается ошибка «System.NullReferenceException», отладчик говорит, что d равно нулю.

Я не совсем разбираюсь в Dgv / DataViews / DataTables, поэтому буду признателен, если вы потратите время, чтобы помочь мне выяснить, в чем здесь проблема.

1 Ответ

0 голосов
/ 05 февраля 2019

Мне удалось найти ответ.Я переключился на BindingLists, и это было намного проще.

Функция для поиска текста:

    List<int> tableauIndex = new List<int>();
        if (text == "")
        {
            lblTexte.Text = "";
            lblCompteur.Text = "";
            for (int i = 0; i < dgv.Rows.Count - 1; i++)
            {
                dgv.Rows[i].Selected = false;
            }
            return;
        }
        if (dgv.RowCount < 1)
        {
            return;
        }
        else
        {
            text = text.ToUpper();
            lblTexte.Text = "Champ répondant au critère: ";
            tbx.SelectionStart = text.Length;
            tbx.Text = text;
            BindingList<EnregCommente> bl = (BindingList<EnregCommente>)dgv.DataSource;
            var sortedListInstance = from EnregCommente enr in bl
                                     where(enr.cle.Contains(text))
                                     select enr;
            foreach (EnregCommente enr in sortedListInstance)
            {
                Console.WriteLine(enr.cle);
            }
            foreach(DataGridViewRow r in dgv.Rows)
            {
                foreach(EnregCommente enr in sortedListInstance)
                {
                    if (r.Cells[0].Value.ToString() == enr.cle)
                    {
                        tableauIndex.Add(r.Index);
                    }
                }
            }
            foreach (DataGridViewRow row in dgv.Rows)
            {
                if (tableauIndex.Contains(row.Index))
                {
                    dgv.Rows[row.Index].Selected = true;
                }
                else
                {
                    dgv.Rows[row.Index].Selected = false;
                }
            }
            foreach (int i in tableauIndex)
            {
                dgv.Rows[i].Selected = true;
            }
        }
        if (dgv.SelectedRows.Count != 0)
        {
            dgv.FirstDisplayedScrollingRowIndex = dgv.SelectedRows[0].Index;
        }
        if (dgv.SelectedRows.Count == 0 && text == "")
        {
            lblCompteur.Text = "";
        }
        else
        {
            lblCompteur.Text = dgv.SelectedRows.Count.ToString();
        }

Функция для сортировки по столбцу:

BindingList<EnregCommente> bl = (BindingList<EnregCommente>)dgv.DataSource;
        var sortedListInstance = new BindingList<EnregCommente>(bl.OrderByDescending(x => x.commentaire).ToList());
        dgv.DataSource = sortedListInstance;

Функция дляЗаполните сетки:

            BindingList<EnregCommente> bl = new BindingList<EnregCommente>();
        foreach (Enregistrement e in source)
        {
            EnregCommente enr = new EnregCommente(e);
            bl.Add(enr);
        }
        grille.DataSource = bl;
        return bl;

Мне нужно было создать новый класс для заполнения сеток, просто нужно взять значения Enregistrement, чтобы поместить их более чистым способом в мой список привязок.

...