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

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

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

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

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

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

PS Я с этим не работал, и затратил на поиск информации 5 минут. Что мешало это сделать вам?
...
Рейтинг: 0 / 0
29.01.2015, 13:26
    #38866629
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BindingSource и фильтрация
Arm79Чтобы использовать фильтр, нужно, чтобы источник данных поддерживал интерфейс IBindingListView . DataTable этот интерфейс поддерживает. Других коллекций, поддерживающих этот интерфейс, я не нашел. Тут
...
Рейтинг: 0 / 0
29.01.2015, 13:42
    #38866648
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BindingSource и фильтрация
Алексей КArm79Чтобы использовать фильтр, нужно, чтобы источник данных поддерживал интерфейс IBindingListView . DataTable этот интерфейс поддерживает. Других коллекций, поддерживающих этот интерфейс, я не нашел. Тут
Спасибо! Я имел ввиду нативные средства, но что в BLT это есть - не знал.
...
Рейтинг: 0 / 0
29.01.2015, 13:55
    #38866667
ЧитательX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BindingSource и фильтрация
Заостряю акцент на том, что нет 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
29.01.2015, 13:59
    #38866671
ЧитательX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BindingSource и фильтрация
Насчет IBindingListView - посмотрел, но пока не "въехал".
Может быть здесь есть решение. Если подскажете на моем примере как это "приготовить" - скажу огромное спасибо!
...
Рейтинг: 0 / 0
29.01.2015, 14:23
    #38866718
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BindingSource и фильтрация
Читатель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
29.01.2015, 14:38
    #38866740
ЧитательX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BindingSource и фильтрация
Arm79 BindSrc.DataSource=list.Where(l => l.ID = 1).ToList()
По сути это каждый раз подмена источника данных. Я именно так и выкрутился, используя Linq для получения нового нужного набора. Но, хотелось чтобы DataSource оставался неизменным, управление отображением бы шло через манипуляции с BindSrc.Filter.
Когда источником данных является DataTable, то подменяя текстовое выражение фильтра очень легко ужимать отображаемый список до его подмножества. При этом изображения грида не слишком "дергается".
...
Рейтинг: 0 / 0
29.01.2015, 15:09
    #38866791
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BindingSource и фильтрация
ЧитательXArm79BindSrc.DataSource=list.Where(l => l.ID = 1).ToList()
По сути это каждый раз подмена источника данных. Я именно так и выкрутился, используя Linq для получения нового нужного набора. Но, хотелось чтобы DataSource оставался неизменным, управление отображением бы шло через манипуляции с BindSrc.Filter.
Когда источником данных является DataTable, то подменяя текстовое выражение фильтра очень легко ужимать отображаемый список до его подмножества. При этом изображения грида не слишком "дергается".
Не вижу в этом особой трагедии.

К тому же Алексей помог - дал ссылку на коллекцию с поддержкой нужного интерфейса. Качайте BLTookit, и используйте не List<T>, а EditableList<T>
...
Рейтинг: 0 / 0
02.02.2015, 13:09
    #38869411
ЧитательX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BindingSource и фильтрация
Спасибо за подсказки.
...
Рейтинг: 0 / 0
03.02.2015, 01:43
    #38869961
Артем G
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BindingSource и фильтрация
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
03.02.2015, 17:47
    #38870670
Артем G
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BindingSource и фильтрация
не ужеле не кому помочь? задачка по сути тривиальная :)
...
Рейтинг: 0 / 0
03.02.2015, 21:33
    #38870811
Артем G
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BindingSource и фильтрация
Понимаю что желающих помочь полно, но из того, что написано не понятно в чем проблема.
Ниже то, что имею в коде. Надеюсь это поможет указать на мои ошибки (с 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
04.02.2015, 16:59
    #38871617
Артем G
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BindingSource и фильтрация
эх, вот ни кто не помог ( опять день убил на решение...

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

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


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

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


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