我有一个函数以相同的方式填充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并不十分了解,因此,如果您能抽出宝贵的时间来帮助我找出问题所在,我将不胜感激。
答案 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的值以一种更简洁的方式放入我的绑定列表中。