【问题标题】:Applying a filter to a BindingSource, but it doesn't work将过滤器应用于 BindingSource,但它不起作用
【发布时间】:2010-09-16 10:16:39
【问题描述】:

我有一个文本框,我在其中放置了一个短语,它可以是任务的描述,也可以是任务的 ID。我想使用此 TextBox 中的文本过滤列表。但是当我将文本放入这个TextBox时,过滤不起作用,并且DataGridView中的集合没有改变。

有什么问题?

public void BindData()
{
    var emptyBindingSource = new BindingSource();
    dataGridViewTaskList.AutoGenerateColumns = false;
    dataGridViewTaskList.DataSource = emptyBindingSource;

    var taskList = GetTasks();

    _bindingSource = new BindingSource();
    _bindingSource.DataSource=taskList.Response;

    dataGridViewTaskList.AutoGenerateColumns = false;

    dataGridViewTaskList.DataSource = _bindingSource.DataSource;

    if (dataGridViewTaskList.Columns["gridViewColumnId"] == null)
        dataGridViewTaskList.Columns.Add(new DataGridViewColumn() {Name = "gridViewColumnId"});
    else
        dataGridViewTaskList.Columns["gridViewColumnId"].DataPropertyName = "Id";

    if (dataGridViewTaskList.Columns["gridViewColumnDescription"] == null)
        dataGridViewTaskList.Columns.Add(new DataGridViewColumn() {Name = "gridViewColumnDescription"});
    else
        dataGridViewTaskList.Columns["gridViewColumnDescription"].DataPropertyName = "Description";
}

private void tbSearchedPhraseOrId_TextChanged(object sender, EventArgs e)
{
    _bindingSource.Filter = string.Format("Id = '{0}'", tbSearchedPhraseOrId.Text);
}

我在 BindData 方法中添加了以下内容,它也不起作用:

_bindingSource.Filter = string.Format("Id LIKE '%{0}%'", "23");

设计师:

this.dataGridViewTaskList.AllowUserToAddRows = false;
this.dataGridViewTaskList.AllowUserToDeleteRows = false;
this.dataGridViewTaskList.AllowUserToOrderColumns = true;
this.dataGridViewTaskList.AllowUserToResizeRows = false;
this.dataGridViewTaskList.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
                        | System.Windows.Forms.AnchorStyles.Left)
                        | System.Windows.Forms.AnchorStyles.Right)));
this.dataGridViewTaskList.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill;
this.dataGridViewTaskList.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
this.dataGridViewTaskList.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dataGridViewTaskList.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.gridViewColumnId,
this.gridViewColumnDescription});
this.dataGridViewTaskList.Location = new System.Drawing.Point(6, 62);
this.dataGridViewTaskList.MultiSelect = false;
this.dataGridViewTaskList.Name = "dataGridViewTaskList";
this.dataGridViewTaskList.ReadOnly = true;
this.dataGridViewTaskList.RowHeadersVisible = false;
this.dataGridViewTaskList.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
this.dataGridViewTaskList.Size = new System.Drawing.Size(414, 488);
this.dataGridViewTaskList.TabIndex = 0;

【问题讨论】:

    标签: c# winforms .net-3.5 bindingsource


    【解决方案1】:

    根据documentation,您的基础数据源(即您的任务列表)必须实现 IBindingListView 接口才能具有有效的 Filter 属性。你确定现在是这种情况吗?

    (顺便说一句,您应该将 DataGridView 的 DataSource 属性设置为 BindingSource 对象本身,而不是 BindingSource.DataSource 属性。)

    【讨论】:

    • 你说得对。由于 BindingSource 的 DataSource 设置为数组:/
    • @user278618 请问你是怎么做到的?
    【解决方案2】:

    您可以随时查看_bindingSource.SupportsFiltering 查看 BindingSource 类型是否支持过滤

    【讨论】:

      【解决方案3】:

      你应该改变:

      dataGridViewTaskList.DataSource = _bindingSource.DataSource;
      

      dataGridViewTaskList.DataSource = _bindingSource;
      

      通过更改_bindingSource.Filter,您实际上并没有更改_bindingSource.DataSource - 它保持不变,因此dataGridViewTaskList.DataSource 也不会更改。另一方面,_bindingSource 已更改,您可以直接绑定到它以获取更改。

      【讨论】:

        【解决方案4】:

        您是否尝试过:

        _bindingSource.Filter = string.Format("gridViewColumnId = '{0}'", tbSearchedPhraseOrId.Text);
        

        你能定义taskList结构吗?

        【讨论】:

          【解决方案5】:

          设置过滤器后尝试调用:_bindingSource.ResetBindings(false);

          你也可以尝试调用:

          dataGridViewTaskList.ResetBindings();
          dataGridViewTaskList.Refresh();
          dataGridViewTaskList.Update();
          

          【讨论】:

            【解决方案6】:

            替代方案 IEnumerable、List.....等全局变量

            listBindingSource.DataSource = List();

            然后简单地过滤列表并重新分配它 listBindingSource.DataSource = List.FindAll(t => t.x == yourValue);

            【讨论】:

            • 你需要整理一下你的答案的格式。您可以在编辑窗口下方看到预览。最好写一个更好的解释。最后,即使您的建议在实践中行得通,它也不是好的编程。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-12-12
            • 1970-01-01
            • 2019-06-17
            • 2011-11-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多