过滤填充IList的datagridview

时间:2014-02-22 14:28:55

标签: datagridview filter ilist

使用以下代码加载我的资源:

public IList LoadResources()
        {
            using (var proxy = new MetaDataServiceReference.MetaDataManagementServiceClient())
            {
                var errorList = new MetaDataServiceReference.ValidationError[] { };
                var result = (from p in proxy.ResourceLoadAll(ref errorList)
                              select new 
                            {
                                BookAuthorId = p.ResourceID,
                                BookAuthorTitle= p.BookTitle
                            }).ToList();
                return result;
            }            
        }

并使用以下代码填充我的datagridview:

private void LoadResources()
        {
            ContentPool Db = new ContentPool();
            IList Resources = Db.LoadResources();
            DgvResourcesOrAuthors.DataSource = Resources;
            DgvResourcesOrAuthors.Columns[0].Visible = false;
        }

如何在FilterTextBox文本更改中过滤我的datagridview数据?

我使用例如此代码,但有错误(对象引用未设置为对象的实例。):

private void TxFilter_TextChanged(object sender, EventArgs e)
        {
            (DgvResourcesOrAuthors.DataSource as DataTable).DefaultView.RowFilter = string.Format("BookAuthorTitle = '{0}'", TxFilter.Text.Trim());
        }

1 个答案:

答案 0 :(得分:1)

您收到NullReferenceException,因为DataGridView.DataSource的类型为IList,您的类型为DataTable

使用列表数据实现过滤,

private void TxFilter_TextChanged(object sender, EventArgs e)
{
    IList var = DgvResourcesOrAuthors.DataSource as IList;
    if(var != null)
    {
        IList filteredData = //iterate list and filter based on condition
        DgvResourcesOrAuthors.DataSource = filteredData;
    }
}

删除过滤后,将DataSource设置为原始列表。

IList Resources = Db.LoadResources();
DgvResourcesOrAuthors.DataSource = Resources;

如果您不想更改数据源,请使用DataTableBindingSource,然后您可以按照帖子中的说明进行过滤。

private void TxFilter_TextChanged(object sender, EventArgs e)
{
    (DgvResourcesOrAuthors.DataSource as DataTable).DefaultView.RowFilter = string.Format("BookAuthorTitle = '{0}'", TxFilter.Text.Trim());
}