DataSource为null,但先前已填充

时间:2019-02-05 09:31:52

标签: c# datagridview datatable dataview

我有一个函数以相同的方式填充5个DataGridView,而另一个函数是在我更改文本框的值以根据文本框的文本排序dgv时调用的

每个dgv都有自己的文本框,因此有单独的“ tbx.text_changed”事件,所有事件都调用了我的函数。

我还有一个按特定列对dgv进行排序的函数,在我填充dgv的列之后调用该函数。 因此,按顺序,我填充了dgv,然后通过名为Commentaires的第三列对其进行排序,然后输入一些文本以从名为Champ的第一列对其进行排序

昨天,我可以在每个dgv中搜索文本,但只能搜索一个。 我试图解决该问题,但是今天我只能搜索以前被窃听的那个。

我在其文本框中输入字母时,其他所有dgv都会引发“空引用”错误。 NullReference指出数据源为空,但不应为空。

昨天孤独的dgv也有同样的错误。

这是我寻找文字的功能:

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;

这是我填充datagridviews的功能:

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

这是我对它们进行排序的功能:

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

最后,我无法对我的数据表进行排序, 我认为这是由于某些转换问题引起的。 我使用文本框的文本对数据表进行排序的函数中发生了错误。

*ngIf

此行引发错误“ System.NullReferenceException” 调试器说d为空。

我对Dgv的/ DataViews / DataTables并不十分了解,因此,如果您能抽出宝贵的时间来帮助我找出问题所在,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

我设法找到了答案。 我切换到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的值以一种更简洁的方式放入我的绑定列表中。