C# BindingSource上的筛选器:数据源是否必须是DataTable
我有一个C# BindingSource上的筛选器:数据源是否必须是DataTable,c#,winforms,datagridview,datatable,C#,Winforms,Datagridview,Datatable,我有一个DataGridView,我绑定在BindingSource上 问题是,当我对它进行过滤时,它不起作用 是否需要在bBingSource数据源上添加过滤器,数据源是一个数据表 现在,它是一个对象列表,但我可以返回一个DataTable 我该不该换 bindingSource1.DataSource = Echange.GetListEchange(contextExecution.ChaineConnexion, criteres); GetListChange,返回Echange的列
DataGridView
,我绑定在BindingSource
上
问题是,当我对它进行过滤时,它不起作用
是否需要在bBingSource数据源
上添加过滤器
,数据源
是一个数据表
现在,它是一个对象列表,但我可以返回一个DataTable
我该不该换
bindingSource1.DataSource = Echange.GetListEchange(contextExecution.ChaineConnexion, criteres);
GetListChange,返回Echange的列表
但在这种情况下,过滤器不起作用:
bindingSource1.Filter = "ec.date_echange IS NULL";
那么,如果我返回一个DataTable
,这会起作用吗?
希望我可以使用过滤器
而不返回数据表
,但是,如果我必须这样做,没有问题
生成数据表:
vRequete += vFrom + " " + vWhere.Trim().TrimEnd("AND".ToCharArray()) + " " + vOrderBy;
vTable = vTarget.RenvoiOneTable(vRequete);
RenvoieOneTable是Oracle提供的一种方法。代码是:
public override DataTable RenvoiOneTable(string piRequest)
{
DataTable poDatable = null;
try
{
poDatable = ChargeDataSet(piRequest).Tables[0];
}
catch (OracleException ThisException)
{
throw new BaseDonneesException(ThisException.Message);
}
catch (Exception ThisExcept)
{
throw new BaseDonneesException(ThisExcept.Message);
}
return poDatable;
}
public override DataSet ChargeDataSet(string piRequest)
{
DataSet poDataset = null;
try
{
//Ouverture de la connection
Connexion.Open();
//Initialisation de la commande
Command.CommandType = CommandType.Text;
//Mise en place dans la variable po_datasets de l'identifiant et du
//dataset voulu
Command.CommandText = piRequest;
using (OracleDataAdapter vAdapter = new OracleDataAdapter(Command))
{
poDataset = new DataSet();
vAdapter.Fill(poDataset);
}
}
catch (OracleException ThisException)
{
throw new BaseDonneesException(ThisException.Message);
}
catch (Exception ThisExcept)
{
throw new BaseDonneesException(ThisExcept.Message);
}
finally
{
if (Connexion.State == ConnectionState.Open)
{
Connexion.Close();
}
}
//Envoye du tableau de DataSet
return poDataset;
}
谢谢。A
DataGridView
只能处理一组二维信息(即一个DataTable
)。尽管依赖绑定
变量并不坏(实际上,这是推荐的),但事实是DataGridView只与它的一个数据表相关(如果绑定源中有多个数据表,则必须通过DataMember
属性指定要成为数据源的数据表).
因此,在考虑绑定源的情况下,您想要在数据源中进行的任何更改都必须在给定的数据表中进行;因此,您观察到的行为是预期的。那么,我的列的所有DataPropertyName在dataTable中都必须有一个名称?我必须(如果我想)在我的数据表中,而不是在其他任何地方?哦,维尔德问题:为什么我的数据网格显示5行,而我的数据表只有4行?@Zaphod 5行,而你的数据表只有4行?我想最后一个是空白的吗?如果您在DataGridView中获得给定DataTable中不存在的任何(非空)信息,这肯定会很奇怪(除非您在逻辑上“手动”将此信息添加到DataGridView)。你能详细说明一下这一切吗?理想情况下,您应该在填充DataTable的位置发布代码,将其提供给绑定变量,并将其设置为DataGridView的数据源。@Zaphod您的代码很好。我猜您是指allowUserToAddress
设置为true时包含的最后一个空行(这是用户希望添加更多值的地方);如果将此标志设置为false,则此附加行将消失。还请记住,为了避免此类问题(此行由Rows.Count
计算,但其内容为空),在遍历DGV单元格时,应始终设置标题条件,检查给定单元格是否为空,然后再尝试对其进行编辑。@VARCABAS Yes,这是AllowUserToAddress
谢谢。我不理解你评论最后的意思。别担心,它只是一个dataGrid,用于查看数据库上的数据,并打印一些信息。(我的尼克是varocarbas)我说的是Rows.Count属性可能不像其他集合中那样“可靠”。例如:列表=新列表();列表。添加(“1”);列表。添加(“2”);list.Count=2,因此可以确保0和Count-1之间的任何元素都不为null。但DGV可能会包含一个额外的空行(例如,由于前面提到的AllowUserToAddress),因此,如果您遍历它的元素并且不检查空行(您不需要使用list),则可能会引发错误。我希望现在一切都清楚了。您有一个名为ec.date\u echange
?