2010-09-16 1 views
3

У меня есть TextBox, в который я помещаю фразу, которая представляет собой описание задачи или идентификатор задачи. Я хочу отфильтровать список, используя текст из этого TextBox. Но когда я помещаю текст в этот TextBox, фильтрация не работает, и коллекция в DataGridView не изменяется.Применение фильтра к BindingSource, но оно не работает

Что может быть неправильным?

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

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

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

+0

Вы имеете право. как DataSource BindingSource - это заданный массив:/ – user278618

+0

@ user278618 Вы можете понять, как вы это сделали? – Volatil3

0

Пробовали ли вы с:

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

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

+0

Я пытался без какого-либо результата:/ – user278618

+0

Я добавил дизайнер код – user278618

0

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

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

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

Он по-прежнему не работает – user278618

1

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

dataGridViewTaskList.DataSource = _bindingSource.DataSource; 

в

dataGridViewTaskList.DataSource = _bindingSource; 

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

1

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

 Смежные вопросы

  • Нет связанных вопросов^_^