在BindingSource上过滤:DataSource必须是DataTable吗?

时间:2013-11-19 11:14:45

标签: c# winforms datagridview datatable

我有一个DataGridView我绑定BindingSource

问题是,当我对它进行过滤时,它不起作用。

是否需要在BndingSource Filter上添加DataSourceDataSourceDataTable

现在,它是jst的一个Object列表,但我可以返回一个DataTable

我应该改变吗?

bindingSource1.DataSource = Echange.GetListEchange(contextExecution.ChaineConnexion, criteres);

GetListEchange,返回Echange列表。

但有了这个,过滤器就不起作用了:

        bindingSource1.Filter =  "ec.date_echange IS NULL";

那么,如果我返回DataTable,这将有效吗? 希望我可以在不返回Filter的情况下使用DataTable但是,如果必须这样做,则没问题。

生成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;
            }

谢谢。

1 个答案:

答案 0 :(得分:1)

DataGridView只能处理一组2D信息(即一个DataTable)。虽然依赖Binding变量(实际上,MSDN推荐)并不坏,但实际情况是DataGridView只与其中一个DataTable相关(如果有多个DataTable)在绑定源中,您必须通过DataSource属性指定要成为DataMember的那个。

因此,在考虑绑定源的情况下,您在DataSource中要进行的任何更改都必须在给定的DataTable中完成;因此,您正在观察的行为是预期的行为。