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