Применение фильтра к BindingSource, но он не работает - PullRequest
3 голосов
/ 16 сентября 2010

У меня есть TextBox, в который я помещаю фразу, которая является либо описанием задачи, либо идентификатором задачи.Я хочу отфильтровать список, используя текст из этого 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;

Ответы [ 6 ]

6 голосов
/ 20 сентября 2010

Согласно документации ваш базовый источник данных (т. Е. Список задач) должен реализовывать интерфейс IBindingListView, чтобы иметь работающее свойство Filter.Вы уверены, что это именно так?

(Кроме того, вы должны установить свойство DataSource вашего DataGridView для самого объекта BindingSource, а не для свойства BindingSource.DataSource.)

1 голос
/ 20 августа 2017

Вы всегда можете проверить _bindingSource.SupportsFiltering, чтобы увидеть, поддерживает ли тип BindingSource фильтрацию

1 голос
/ 24 сентября 2010

Вы должны изменить:

dataGridViewTaskList.DataSource = _bindingSource.DataSource;

до

dataGridViewTaskList.DataSource = _bindingSource;

Изменяя _bindingSource.Filter, вы на самом деле не изменяете _bindingSource.DataSource - он остается прежним и из-за этого dataGridViewTaskList.DataSource тоже не меняется. С другой стороны, _bindingSource изменено, и вы можете связать его напрямую, чтобы получить это изменение.

0 голосов
/ 09 июля 2018

Альтернатива IEnumerable, List ..... etc Глобальная переменная

listBindingSource.DataSource = List ();

Затем просто отфильтруйте список иПереопределите его listBindingSource.DataSource = List.FindAll (t => tx == yourValue);

0 голосов
/ 17 сентября 2010

Попробуйте позвонить: _bindingSource.ResetBindings(false); после настройки фильтра.

Также вы можете попробовать позвонить:

dataGridViewTaskList.ResetBindings();
dataGridViewTaskList.Refresh();
dataGridViewTaskList.Update();
0 голосов
/ 16 сентября 2010

Вы пробовали с:

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

Можете ли вы определить структуру taskList?

...