Как привязать List <DisplayedInfo>к datagridview с помощью библиотеки DataGridViewAutoFilter? - PullRequest
0 голосов
/ 14 июля 2020

Мне нужно добавить функцию фильтра в свой DataGridView. Я пытаюсь использовать библиотеку DataGridViewAutoFilter сегодня, но она не работает для моего приложения Winform, если я использую desinger для изменения типа столбца на DataGridViewAutoFilterTextBoxColumn, как мне было сказано в документе. посмотрел на образец DataGridViewAutoFilter sample.Я думаю, что есть некоторая проблема в привязке источника данных. Я привязываю свой источник данных следующим образом:

enter image description here

The DisplayedInfo is the metedata object I am using to store the infomation. my binding code is

Ilist infos = new List();
infos = GetAllInfosFromServer();
displayedInfoBindingSource = infos;

I think I can't use type List here as my data source cause the document of DataGridViewAutoFilter indicate that BindingSource component must be bound to anIBindingListView. The sample project of DataGridViewAutoFilter bind data source like this:

enter image description here

About the newDataSet,it seems like a coustom component,I don't quiet get it how it works.It looks like this on designer:

enter image description here

You can get sample projects here: образец URL загрузки . Итак, как мне изменить свой код, чтобы он работал как образец?

Я пытаюсь преобразовать свой List в IBindingListView орудие, например Equin.ApplicationFramework.BingdingListView, но все равно не работает. пожалуйста !! Вот мой код конвертации:

public class AdvancedListHelper
{
    public static BindingListView<DisplayedInfo> ListToBindableList(IList<DisplayedInfo> infos)
    {
        if (infos == null)
        {
            return null;
        }

        BindingListView<DisplayedInfo> advancedInfos = new BindingListView<DisplayedInfo>((List<DisplayedInfo>)infos);
           
        return advancedInfos;
    }

}

Я обнаружил проблему с DataGridViewAutoFilter. Вы не можете изменить FilteringEnabled на true в дизайнере. Я не знаю почему, но я добавляю это код для моей формы winform:

foreach (DataGridViewColumn col in columns)
{
    if (col is DataGridViewAutoFilter.DataGridViewAutoFilterTextBoxColumn)
    {
        var c = col as DataGridViewAutoFilter.DataGridViewAutoFilterTextBoxColumn;
        var cell = c.HeaderCell;
        if (cell is DataGridViewAutoFilter.DataGridViewAutoFilterColumnHeaderCell)
        {
            var ce = cell as DataGridViewAutoFilter.DataGridViewAutoFilterColumnHeaderCell;
            ce.FilteringEnabled = true;
        }
    }
}

Теперь я могу сделать кнопку «Фильтр» видимой, но когда я нажимаю кнопку, я получаю необработанное исключение, в котором говорится: System.NotSupportedException: Cannot set filter from строковое выражение. * 10 23 * Думаю, это проблема Equin.ApplicationFramework.BingdingListView. Так что сейчас мне действительно нужен класс для замены Equin.ApplicationFramework.BingdingListView. Есть идеи?

1 Ответ

0 голосов
/ 15 июля 2020

одним словом deferred execution

Добавьте .ToList() либо внутри ListToBindableList, либо в его возвращаемое значение.

...