powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / BindingSource и фильтрация
20 сообщений из 20, страница 1 из 1
BindingSource и фильтрация
    #38866201
ЧитательX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тема такая:
Есть класс элемента коллекции
class Item{ public int ID { get; set; } public int ... }
Есть некоторая коллекция этих элементов List<Item> list= ...
Есть BindingSource, который эту коллекцию подает на DataGridView.

Можно ли использовать свойство фильтр у BindingSource? Например, чтобы грид отобразил только строчку с Item.ID=1
...
Рейтинг: 0 / 0
BindingSource и фильтрация
    #38866220
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ЧитательX,

Можно
...
Рейтинг: 0 / 0
BindingSource и фильтрация
    #38866307
ЧитательX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Даже боюсь спросить КАК?
...
Рейтинг: 0 / 0
BindingSource и фильтрация
    #38866480
RomanH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЧитательXДаже боюсь спросить КАК?
Реализовать в коллекции IBindingListView
...
Рейтинг: 0 / 0
BindingSource и фильтрация
    #38866498
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в чем проблема? Что вы попробовали и что не получилось?

Синтаксис того, что можно писать в качестве значения для Filter, можно посмотреть здесь

Чтобы использовать фильтр, нужно, чтобы источник данных поддерживал интерфейс IBindingListView . DataTable этот интерфейс поддерживает. Других коллекций, поддерживающих этот интерфейс, я не нашел.

Так что либо используйте DataTable в качестве DataSource, либо делайте свой списочный класс с поддержкой IBindingListView (тяжело и нет смысла), либо фильтруйте коллекцию через LINQ и передавайте отфильтрованые значения в DataSource

PS Я с этим не работал, и затратил на поиск информации 5 минут. Что мешало это сделать вам?
...
Рейтинг: 0 / 0
BindingSource и фильтрация
    #38866629
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Чтобы использовать фильтр, нужно, чтобы источник данных поддерживал интерфейс IBindingListView . DataTable этот интерфейс поддерживает. Других коллекций, поддерживающих этот интерфейс, я не нашел. Тут
...
Рейтинг: 0 / 0
BindingSource и фильтрация
    #38866648
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КArm79Чтобы использовать фильтр, нужно, чтобы источник данных поддерживал интерфейс IBindingListView . DataTable этот интерфейс поддерживает. Других коллекций, поддерживающих этот интерфейс, я не нашел. Тут
Спасибо! Я имел ввиду нативные средства, но что в BLT это есть - не знал.
...
Рейтинг: 0 / 0
BindingSource и фильтрация
    #38866667
ЧитательX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Заостряю акцент на том, что нет DataTable.
Есть список
List<Item> list= new List<Item>()

item= new Item(){ID=1, .....} list.Add(item);
item= new Item(){ID=2, .....} list.Add(item);
.....

BindSrc.DataSource=list;
Grid.DataSource=BindSrc;

Например, нужно спрятать в гриде все строчки кроме item.ID=1

BindSrc.Filter="Что тут???";

Здесь нет DataRow. Тут есть элемент рукодельного класса Item.
Как написать текст в фильтре, чтобы указать на свойство Item.ID??

Может быть у BindingSource можно перекрыть какой-нибудь метод, который отвечает за перебор содержимого?
...
Рейтинг: 0 / 0
BindingSource и фильтрация
    #38866671
ЧитательX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Насчет IBindingListView - посмотрел, но пока не "въехал".
Может быть здесь есть решение. Если подскажете на моем примере как это "приготовить" - скажу огромное спасибо!
...
Рейтинг: 0 / 0
BindingSource и фильтрация
    #38866718
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЧитательXЗаостряю акцент на том, что нет DataTable.
Есть список
List<Item> list= new List<Item>()

item= new Item(){ID=1, .....} list.Add(item);
item= new Item(){ID=2, .....} list.Add(item);
.....

BindSrc.DataSource=list;
Grid.DataSource=BindSrc;

Например, нужно спрятать в гриде все строчки кроме item.ID=1

BindSrc.Filter="Что тут???";

Здесь нет DataRow. Тут есть элемент рукодельного класса Item.
Как написать текст в фильтре, чтобы указать на свойство Item.ID??

Может быть у BindingSource можно перекрыть какой-нибудь метод, который отвечает за перебор содержимого?

BindSrc.DataSource=list.Where(l => l.ID = 1).ToList()
...
Рейтинг: 0 / 0
BindingSource и фильтрация
    #38866740
ЧитательX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79 BindSrc.DataSource=list.Where(l => l.ID = 1).ToList()
По сути это каждый раз подмена источника данных. Я именно так и выкрутился, используя Linq для получения нового нужного набора. Но, хотелось чтобы DataSource оставался неизменным, управление отображением бы шло через манипуляции с BindSrc.Filter.
Когда источником данных является DataTable, то подменяя текстовое выражение фильтра очень легко ужимать отображаемый список до его подмножества. При этом изображения грида не слишком "дергается".
...
Рейтинг: 0 / 0
BindingSource и фильтрация
    #38866791
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЧитательXArm79BindSrc.DataSource=list.Where(l => l.ID = 1).ToList()
По сути это каждый раз подмена источника данных. Я именно так и выкрутился, используя Linq для получения нового нужного набора. Но, хотелось чтобы DataSource оставался неизменным, управление отображением бы шло через манипуляции с BindSrc.Filter.
Когда источником данных является DataTable, то подменяя текстовое выражение фильтра очень легко ужимать отображаемый список до его подмножества. При этом изображения грида не слишком "дергается".
Не вижу в этом особой трагедии.

К тому же Алексей помог - дал ссылку на коллекцию с поддержкой нужного интерфейса. Качайте BLTookit, и используйте не List<T>, а EditableList<T>
...
Рейтинг: 0 / 0
BindingSource и фильтрация
    #38869411
ЧитательX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за подсказки.
...
Рейтинг: 0 / 0
BindingSource и фильтрация
    #38869961
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Me.dd03mBindingSource.Filter = "FIELDNAME LIKE '%" + textbox.Text + "%' or DDTEXT LIKE '%" + textbox.Text + "%'"

FIELDNAME, DDTEXT - название столбцов

У меня в свою очередь вопрос.
Плизз помоги понять как добавлять и удалять записи.

Как и у тебя биндинг содержит List. Данные редактируются но удаляться и добавляться через context.SaveChanges() не хотят.


Вот тут http://www.codeproject.com/Articles/221931/Entity-Framework-in-WinForms

вычитал что нужно использовать EntityDataSource потому как List с минимальной функциональностью

If you run the code, however, you will notice some serious limitations: you can’t sort or filter the data, you can’t add or remove items from the list, and of course you don’t get to customize the grid columns at design time using the grid’s column editor.

These limitations are due to the fact that the list used as a data source is simply a snapshot of the data. So although the objects in the list are “live”, the list itself is not. And the IBindingList that WinForms creates automatically for you in this case provides only minimal functionality.

EntityDataSource добавить по какой то загадочной причине не получается... он серый.

Можно конечно отлавливать в событиях UserAdded и UserDeleted строки и удалять их из контекста...


подскажите плизз как правильно.
...
Рейтинг: 0 / 0
BindingSource и фильтрация
    #38870670
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не ужеле не кому помочь? задачка по сути тривиальная :)
...
Рейтинг: 0 / 0
BindingSource и фильтрация
    #38870811
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Понимаю что желающих помочь полно, но из того, что написано не понятно в чем проблема.
Ниже то, что имею в коде. Надеюсь это поможет указать на мои ошибки (с EF и List только начал разбираться).

Данные в датагриде отображаются, но как их сохранить не пойму (

Add, Update и Delete в репозитории не использую. Хотелось бы добавлять, редактировать, удалять не отлавливая события датагрида, а просто в конце по нажатию кнопки сохранять все сделанные изменения.

В примере ниже вообще не понять как сохранить данные
Когда в репозитории вместо Private context As BindingList(Of Owners) было Private context As DataLayer то, получалось сохранить только Update. Добавить и Удалить не получалось.


Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
Слепок базы

 Partial Public Class SqlDataLayer
    Inherits DbContext

    Public Sub New()
        MyBase.New("name=SqlDataLayer")        
    End Sub

    Public Overridable Property Owners As DbSet(Of Owners)
    В базе есть еще таблицы. Здесь удалил оставив одну.

End Class


Partial Public Class Owners

    <Key>
    Public Property Id As Short

    <StringLength(100)>
    Public Property Name As String

End Class

Public Class OwnersRepository
    Implements IOwnersRepository, IDisposable

    Private context As BindingList(Of Owners)

    Sub New(dataLayer As SqlDataLayer)
        context = New BindingList(Of Owners)(dataLayer.Owners.ToList)
    End Sub

    Public Function Load() As BindingList(Of Owners) Implements IOwnersRepository.Load
        Return context
    End Function

    Public Sub Add(entry As Owners) Implements IOwnersRepository.Add
        context.Add(entry)
    End Sub

    Public Sub Delete(entry As Owners) Implements IOwnersRepository.Delete
        context.Remove(entry)
    End Sub

    Public Sub Update(entry As Owners) Implements IOwnersRepository.Update
       как здесь не очень пока понятно
    End Sub

    Public Sub Save() Implements IOwnersRepository.Save
       как здесь не очень пока понятно
    End Sub

    #Region "IDisposable Support"
    В коде есть. Здесь удалил за не надобностью.
    #End Region

End Class


Здесь то, как пытаюсь реализовать форму

Public Class FormOwners

    Private ownersRepository As IOwnersRepository

    Private ownersBindingSource As New BindingSource


    Private Sub FormOwners_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Try

            Me.ownersRepository = New OwnersRepository(New SqlDataLayer)

            Me.ownersBindingSource.DataSource = Me.ownersRepository.Load

            Me.OwnersDataGridView.DataSource = Me.ownersBindingSource

        Catch exLoad As Exception

            Me.ButtonSave.Enabled = False

            MessageBox.Show("Reason: " + vbNewLine + exLoad.Message, "Exception: to load is not possible!", MessageBoxButtons.OK, MessageBoxIcon.Error)

        End Try

    End Sub


    Private Sub ButtonSave_Click(sender As Object, e As EventArgs) Handles ButtonSave.Click

        Try

            Cursor = Cursors.WaitCursor

            Me.ownersRepository.Save()

        Catch exSave As Exception

            MessageBox.Show("Reason: " + vbNewLine + exSave.Message, "Exception: to save is not possible!", MessageBoxButtons.OK, MessageBoxIcon.Error)

        Finally

            Cursor = Cursors.Default

        End Try

    End Sub
...
Рейтинг: 0 / 0
BindingSource и фильтрация
    #38871617
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
эх, вот ни кто не помог ( опять день убил на решение...

Коротко вот это работает.
Me.OwnersBindingSource.DataSource = context.Owners.Local.ToBindingList
...
Рейтинг: 0 / 0
BindingSource и фильтрация
    #38871813
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Убил день ? Это твои личные трудности
...
Рейтинг: 0 / 0
BindingSource и фильтрация
    #38871860
LameUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем Gэх, вот ни кто не помог ( опять день убил на решение...

Коротко вот это работает.
Me.OwnersBindingSource. DataSource = context.Owners. Local.ToBindingList


Вы разве не хотели фильтрации в изначальном посте, чтобы не дергать DataSource?
А тут вы тупо подменяется DataSource один другим?
...
Рейтинг: 0 / 0
BindingSource и фильтрация
    #38879756
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил,

ну да, мои. Спасибо за ваш бестолковый коммент. как вам такое?
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / BindingSource и фильтрация
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]