Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.82/60: Рейтинг темы: голосов - 60, средняя оценка - 4.82
84 / 83 / 6
Регистрация: 13.07.2009
Сообщений: 107

Группировка и сортировка привязанных изменяющихся данных

30.10.2009, 20:15. Показов 11513. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В данный момент разбираюсь в привязке данных в WPF. ИМХО, как это реализовано - мрак, ну да приходится мириться и пользоваться тем, что есть.
Последнее, о чем прочитал - Сортировка и Группировка привязанных данных. До этого много пришлось танцевать с бубном, что бы добиться автообновления ListBox при добавлении/удалении элементов в связанную коллекцию, а так же изменении их содержимого.
Коллекцию пришлось разместить в классе ObservableCollection, базовый класс с данными унаследовал интерфейс INotifyPropertyChanged. Отдельного разговора стоит история, как я потом переходил на темплейты, но сейчас хочу спросить о такой проблеме:

В образовательных целях добавил сортировку и группировку данных. Данные при добавлении новых элементов группируются и сортируются, но вот если изменить поле, по которому данные группируются, после добавления - эти изменения ListBox не отображает. Та же проблема с сортировкой.

Раньше пришло применить интерфейс INotifyPropertyChanged именно потому, что контрол не отображал измененное поле, но в ситуации с сортировкой и группировкой этот прием не дает желаемого эффекта . Кто знает как побороть эту новую напасть?

Привожу весь код, а заодно и проект выкладываю, так как мне пока попадалось толко одно похожее решение, а задача достаточно жизненная.

C#
C#
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Collections.ObjectModel;
using System.ComponentModel;
 
namespace Practice
{
  /// <summary>
  /// Interaction logic for Window1.xaml
  /// </summary>
  /// 
  public partial class Window1:Window
  {
    TestCollection list;
    TestClass[] a= new TestClass[]{ new TestClass("Иванов И.И.","somewhere1",true),
        new TestClass("Petrov P.P.","somewhere2"),
        new TestClass("Sidorov S.S.","somewhere3"),
        new TestClass("Smirnova L.D.","somewhere4")};
    private static int index=0;
 
    public Window1()
    {
      InitializeComponent();
      list=new TestCollection();
      list.Add(a[0]);
      myListBox.ItemsSource=list.List;
    }
 
    private void Button_Click(object sender,RoutedEventArgs e)
    {
      if (index<(a.Length-1))
      {
        list.Add(a[++index]);
      }
    }
 
    private void Button_Click_1(object sender,RoutedEventArgs e)
    {
      list.FixPerson(index);
    }
  }
 
  public class TestClass:INotifyPropertyChanged
  {
    public TestClass(string fio,string adress):this(fio,adress,false)
    {
    }
 
    public TestClass(string fio,string adress,bool fix)
    {
      this.fio=fio;
      this.adress=adress;
      this.fix=fix;
    }
 
    //INotifyPropertyChanged Members
    public event PropertyChangedEventHandler PropertyChanged;
    private void raisePropertyChanged(string propertyName)
    {
      if (PropertyChanged!=null)
        PropertyChanged(this,new PropertyChangedEventArgs(propertyName));
    }
 
    private bool fix=false;
    public bool Fix
    {
      get { return fix; }
      set
      {
        fix=value;
        raisePropertyChanged("Fix");
        raisePropertyChanged("FIO");
      }
    }
 
    private string fio;
    public string FIO
    {
      get
      {
        if (fix)
          return "(fixed) "+fio;
        else
          return fio;
      }
    }
 
    private string adress;
    public string Adress { get { return adress; } }
  }
 
  public class TestCollection
  {
    private ObservableCollection<TestClass> list=new ObservableCollection<TestClass>();
    public ObservableCollection<TestClass> List
    {
      get { return list; }
    }
 
    public TestCollection()
    {
      ICollectionView view=CollectionViewSource.GetDefaultView(list);
      view.SortDescriptions.Add(new SortDescription("FIO",ListSortDirection.Ascending));
      view.GroupDescriptions.Add(new PropertyGroupDescription("Fix",new FixGrouper()));
    }
 
    public class FixGrouper:IValueConverter
    {
      public object Convert(object value,Type targetType,object parameter,System.Globalization.CultureInfo culture)
      {
        if ((bool)value)
          return "Clicked";
        else
          return "Not Clicked";
      }
 
      public object ConvertBack(object value,Type targetType,object parameter,System.Globalization.CultureInfo culture)
      {
        throw new NotImplementedException();
      }
    }
 
    public void Add(TestClass person)
    {
      list.Add(person);
    }
 
    public void FixPerson(int index)
    {
      list[index].Fix=true;
    }
  }
}
XAML
XML
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
<Window x:Class="Practice.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:Practice"    
    Title="Window1" Height="300" Width="300">
  <Window.Resources>
    <DataTemplate x:Key="ListboxTemplate">
      <Border Name="border" BorderBrush="Aqua" BorderThickness="1"
              Padding="5" Margin="5">
        <Grid>
          <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
          </Grid.RowDefinitions>
          <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
          </Grid.ColumnDefinitions>
 
          <TextBlock Grid.Row="0" Grid.Column="0">FIO:</TextBlock>
          <TextBlock Grid.Row="0" Grid.Column="1" HorizontalAlignment="Left" Text="{Binding Path=FIO}"></TextBlock>
          <TextBlock Grid.Row="1" Grid.Column="0">Address:</TextBlock>
          <TextBlock Grid.Row="1" Grid.Column="1" HorizontalAlignment="Left" Text="{Binding Path=Adress}"></TextBlock>
        </Grid>
      </Border>
    </DataTemplate>
  </Window.Resources>
  <StackPanel>
    <ListBox Name="myListBox" 
             ItemTemplate="{StaticResource ListboxTemplate}" Width="200"
             HorizontalContentAlignment="Stretch" 
             IsSynchronizedWithCurrentItem="True">
      <ListBox.GroupStyle>
        <GroupStyle>
          <GroupStyle.HeaderTemplate>
            <DataTemplate>
              <Label Content="{Binding Path=Name}" Foreground="White"
              Padding="4">
                <Label.Background>
                  <LinearGradientBrush>
                    <GradientStop Color="Blue" Offset="0" />
                    <GradientStop Color="Green" Offset=".25" />
                    <GradientStop Color="Yellow" Offset=".5" />
                    <GradientStop Color="Orange" Offset=".75" />
                    <GradientStop Color="Red" Offset="1" />
                  </LinearGradientBrush>
                </Label.Background>
              </Label>
            </DataTemplate>
          </GroupStyle.HeaderTemplate>
        </GroupStyle>
      </ListBox.GroupStyle>
    </ListBox>
    <Button Click="Button_Click">Add</Button>
    <Button Click="Button_Click_1">Fix</Button>
  </StackPanel>
</Window>
Вложения
Тип файла: rar Practice.rar (52.7 Кб, 55 просмотров)
2
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.10.2009, 20:15
Ответы с готовыми решениями:

Сортировка и группировка данных в Silverlight3
Кто-нибудь может объяснить почему представления не работают в Silverlight3? Например имеется некий класс SampleCollection который...

Отображение привязанных данных в виде checkBox
Доброго времени суток. У меня имеется примитивная модель: public class Student { public string FullName { get; set;...

Проблема с получением привязанных данных при передаче готового объекта
все привет.Помогите разобраться У меня есть главная форма. По кнопке вызывается форма 2 на которой пользователь вносит данные. ...

21
0 / 0 / 0
Регистрация: 24.08.2014
Сообщений: 3
14.11.2009, 22:38
попробуй применить CollectionViewSource он специально предназначен для таких задач
примеров использования довольно много даже в msdn
0
84 / 83 / 6
Регистрация: 13.07.2009
Сообщений: 107
15.11.2009, 17:04  [ТС]
sergiy, Если ты внимательно смотрел мой пример, то должен был заметить этот конструктор
C#
1
2
3
4
5
6
    public TestCollection()
    {
      ICollectionView view=CollectionViewSource.GetDefaultView(list);
      view.SortDescriptions.Add(new SortDescription("FIO",ListSortDirection.Ascending));
      view.GroupDescriptions.Add(new PropertyGroupDescription("Fix",new FixGrouper()));
    }
Проблема в том, что этот код группирует и сортирует предварительно подготовленные данные, но не изменяет расположение элементов после того, как были внесены изменения в ключевые поля.
2
 Аватар для BitFields
49 / 47 / 1
Регистрация: 03.08.2009
Сообщений: 101
16.11.2009, 08:47
Цитата Сообщение от max_cn Посмотреть сообщение
sergiy, Если ты внимательно смотрел мой пример, то должен был заметить этот конструктор
C#
1
2
3
4
5
6
    public TestCollection()
    {
      ICollectionView view=CollectionViewSource.GetDefaultView(list);
      view.SortDescriptions.Add(new SortDescription("FIO",ListSortDirection.Ascending));
      view.GroupDescriptions.Add(new PropertyGroupDescription("Fix",new FixGrouper()));
    }
Проблема в том, что этот код группирует и сортирует предварительно подготовленные данные, но не изменяет расположение элементов после того, как были внесены изменения в ключевые поля.
Для этого и используется интерфейс INotifyPropertyChanged, потому что он содержит необходимое событие для этих целей такое как PropertyChanged, тебе остается только запрограммировать его
думаю тебе имеет смысл почитать эту статью в msdn http://msdn.microsoft.com/ru-r... anged.aspx
0
84 / 83 / 6
Регистрация: 13.07.2009
Сообщений: 107
16.11.2009, 11:47  [ТС]
BitFields, у меня такое чувство, что никто внимательно не читает и не вникает в вопросы :-\.
Вот что я писал в начале первого поста:
Раньше пришло применить интерфейс INotifyPropertyChanged именно потому, что контрол не отображал измененное поле, но в ситуации с сортировкой и группировкой этот прием не дает желаемого эффекта .
Я специально выложил солюшн, что бы любой мог убедится, что вроде бы все организовано как нужно, но не работает должным образом...
0
 Аватар для BitFields
49 / 47 / 1
Регистрация: 03.08.2009
Сообщений: 101
16.11.2009, 11:53
Да ситуация сложней с этим классом чем я думал, может попробовать помимо наследования от интерфейса INotifyPropertyChanged, ObservableCollection
C#
1
2
public class BlankRowCollection<T>:ObservableCollection<T>
    where T : INotifyPropertyChanged, new()
0
84 / 83 / 6
Регистрация: 13.07.2009
Сообщений: 107
16.11.2009, 12:49  [ТС]
BitFields, я использовал обертку вокруг ObservableCollection<T>, что тоже самое, но для чистоты совести попробовал и прямое наследование:
C#
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Collections.ObjectModel;
using System.ComponentModel;
 
namespace Practice
{
  /// <summary>
  /// Interaction logic for Window1.xaml
  /// </summary>
  /// 
  public partial class Window1:Window
  {
    TestCollection list;
    TestClass[] a= new TestClass[]{ new TestClass("Иванов И.И.","somewhere1",true),
        new TestClass("Petrov P.P.","somewhere2"),
        new TestClass("Sidorov S.S.","somewhere3"),
        new TestClass("Smirnova L.D.","somewhere4")};
    private static int index=0;
 
    public Window1()
    {
      InitializeComponent();
      list=new TestCollection();
      list.Add(a[0]);
      myListBox.ItemsSource=list;
    }
 
    private void Button_Click(object sender,RoutedEventArgs e)
    {
      if (index<(a.Length-1))
      {
        list.Add(a[++index]);
      }
    }
 
    private void Button_Click_1(object sender,RoutedEventArgs e)
    {
      list.FixPerson(index);
    }
  }
 
  public class TestClass:INotifyPropertyChanged
  {
    public TestClass(string fio,string adress):this(fio,adress,false)
    {
    }
 
    public TestClass(string fio,string adress,bool fix)
    {
      this.fio=fio;
      this.adress=adress;
      this.fix=fix;
    }
 
    //INotifyPropertyChanged Members
    public event PropertyChangedEventHandler PropertyChanged;
    private void raisePropertyChanged(string propertyName)
    {
      if (PropertyChanged!=null)
        PropertyChanged(this,new PropertyChangedEventArgs(propertyName));
    }
 
    private bool fix=false;
    public bool Fix
    {
      get { return fix; }
      set
      {
        fix=value;
        raisePropertyChanged("Fix");
        raisePropertyChanged("FIO");
      }
    }
 
    private string fio;
    public string FIO
    {
      get
      {
        if (fix)
          return "(fixed) "+fio;
        else
          return fio;
      }
    }
 
    private string adress;
    public string Adress { get { return adress; } }
  }
 
  public class TestCollection : ObservableCollection<TestClass>
  {
    //private ObservableCollection<TestClass> list=new ObservableCollection<TestClass>();
    //public ObservableCollection<TestClass> List
    //{
    //  get { return list; }
    //}
 
    public TestCollection()
    {
      //ICollectionView view=CollectionViewSource.GetDefaultView(list);
      ICollectionView view=CollectionViewSource.GetDefaultView(this);
      view.SortDescriptions.Add(new SortDescription("FIO", ListSortDirection.Ascending));
      view.GroupDescriptions.Add(new PropertyGroupDescription("Fix",new FixGrouper()));
    }
 
    public class FixGrouper:IValueConverter
    {
      public object Convert(object value,Type targetType,object parameter,System.Globalization.CultureInfo culture)
      {
        if ((bool)value)
          return "Clicked";
        else
          return "Not Clicked";
      }
 
      public object ConvertBack(object value,Type targetType,object parameter,System.Globalization.CultureInfo culture)
      {
        throw new NotImplementedException();
      }
    }
 
    public void FixPerson(int index)
    {
      this[index].Fix=true;
    }
  }
}
Как я и предполагал, результат тот же.


BitFields, не в обиду, если действительно хочешь помочь - загрузи мой проект и проверь все догадки на нем, вместо того, что бы озвучивать то, что я уже давно попробовал и привел .
Поверь, я уже давно не студент и если что-то спрашиваю, то это значит, что я уже провозился над проблемой не один час .
0
 Аватар для BitFields
49 / 47 / 1
Регистрация: 03.08.2009
Сообщений: 101
16.11.2009, 14:29
Немного изменил проект, хотя работает по-прежнему не совсем правильно
Как прикрепить файл?
0
 Аватар для BitFields
49 / 47 / 1
Регистрация: 03.08.2009
Сообщений: 101
16.11.2009, 14:50
Цитата Сообщение от BitFields Посмотреть сообщение
Немного изменил проект, хотя работает по-прежнему не совсем правильно
[ATTACH]Слегка отредактированная версия[/ATTACH]
Вложения
Тип файла: rar GroupingAndSorting.rar (46.6 Кб, 55 просмотров)
2
84 / 83 / 6
Регистрация: 13.07.2009
Сообщений: 107
16.11.2009, 15:05  [ТС]
BitFields, Спасибо тебе просто за то, что пытаешься помочь, ну и за пример способа оформления бизнес-логики.
Правда в связи с неизмененной логикой, мы ни на шаг не приблизились к решению моей проблемы .

Не по теме:

Через час иду сдавать экзамен Microsoft по WPF, но Microsoft таких глобальных задач в вопросах не ставит, так что, уверен, сегодня еще одним сертифицированным спецом станет больше ;)

1
 Аватар для BitFields
49 / 47 / 1
Регистрация: 03.08.2009
Сообщений: 101
16.11.2009, 15:22
Удачи!

Добавлено через 1 минуту
C#
1
2
3
4
5
6
7
8
9
10
private void raisePropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                this.Address = address;
                this.FIO = fio;
                this.Fix = fix;
            }
        }
//Но почему-то выдает исключение?

Добавлено через 11 минут
C#
1
Text="{Binding Path=FIO, Mode=TwoWay}"
0
84 / 83 / 6
Регистрация: 13.07.2009
Сообщений: 107
16.11.2009, 19:05  [ТС]
BitFields, Первый пример не правильный по сути подхода, который подразумевает функцию, для сообщения о изменении конкретного свойства.
Второй ничего не меняет, так как по умолчанию Mode=TwoWay и используется .

Не по теме:

За пожелания удачи спасибо - сдал ;)

0
 Аватар для BitFields
49 / 47 / 1
Регистрация: 03.08.2009
Сообщений: 101
16.11.2009, 19:47
Цитата Сообщение от max_cn Посмотреть сообщение
BitFields, Первый пример не правильный по сути подхода, который подразумевает функцию, для сообщения о изменении конкретного свойства.
Второй ничего не меняет, так как по умолчанию Mode=TwoWay и используется .

Не по теме:

За пожелания удачи спасибо - сдал ;)

Вроде весь твой код более чем рабочий и правильно изменяет значение, вот проект для проверки изменения значение темплейта.

[ATTACH]Проект[/ATTACH]
Вложения
Тип файла: rar GroupingAndSorting.rar (266.2 Кб, 39 просмотров)
1
 Аватар для BitFields
49 / 47 / 1
Регистрация: 03.08.2009
Сообщений: 101
16.11.2009, 22:23
Теперь сделал на основе этого кода "продвинутый проект" с темплейтами изображения и возможностью изменять их
Вообще тема очень хороша включает класс ObservableColllection, интерфейс INotifyPropertyChanged и пример для стилизации и использование шаблонов с помощью DateTemplate.
0
 Аватар для BitFields
49 / 47 / 1
Регистрация: 03.08.2009
Сообщений: 101
17.11.2009, 13:58
Немного изменил проект и добавил к ресурсам XmlDataProvider
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<XmlDataProvider x:Key="dataXml" Source="Data/dataXml.xml"/>
<DataTemplate x:Key="ListboxTemplate">
            <Border x:Name="border" BorderBrush="Aqua" BorderThickness="1"
              Padding="5" Margin="5">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition/>
                        <RowDefinition/>
                        <RowDefinition/>
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition />
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>
                    <TextBlock Grid.Row="0" Grid.Column="0"><Run Text="FIO:"/></TextBlock>
                    <TextBox   Grid.Row="0" Width="100" Grid.Column="1" HorizontalAlignment="Left" Text="{Binding Mode=TwoWay, XPath=FIO}"/>
                    <TextBlock Grid.Row="1" Grid.Column="0"><Run Text="Address:"/></TextBlock>
                    <TextBox   Grid.Row="1" Width="100" Grid.Column="1" HorizontalAlignment="Left" Text="{Binding Mode=TwoWay, XPath=Address}"/>
                </Grid>
            </Border>
</DataTemplate>
XML
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
<?xml version="1.0" encoding="utf-8" ?> 
<!--===================================
             EXPRESSION XML
====================================-->
 
<Window>
  <TestClass>
    <FIO>Иванов И.И.</FIO>
    <Fix>true</Fix>
    <Address>somewhere1</Address>
  </TestClass>
  <TestClass>
    <FIO>Loler L.D.</FIO>
    <Fix>somewhere2</Fix>
    <Address>street</Address>
  </TestClass>
  <TestClass>
    <FIO>Sidorov S.S.</FIO>
    <Fix>false</Fix>
    <Address>somewhere3</Address>
  </TestClass>
  <TestClass>
    <FIO>Petrov P.P.</FIO>
    <Fix>false</Fix>
    <Address>somewhere4</Address>
  </TestClass>
  <TestClass>
    <FIO>Leverage</FIO>
    <Address>serial</Address>
    <Fix>true</Fix>
  </TestClass>
</Window>
0
 Аватар для BitFields
49 / 47 / 1
Регистрация: 03.08.2009
Сообщений: 101
18.11.2009, 16:15
Цитата Сообщение от max_cn Посмотреть сообщение
Второй ничего не меняет, так как по умолчанию Mode=TwoWay и используется
По умолчанию привязка стоит в Default-это означает что для разных контролов разная привязка, для ListBox привязка по умолчанию OneWay
Заметки
0
84 / 83 / 6
Регистрация: 13.07.2009
Сообщений: 107
18.11.2009, 17:49  [ТС]
BitFields, Согласен, я допустил неточность . Я имел в виду, что для данного контрола дефолтное значение и TwoWay дадут тот же эффект, так как ListBox не предусматривает изменение данных.

В любом случае, даже не смотря на то, что задача действительно оказалась многогранной и жизненной (о чем я написал в самом начале), решение проблемы визуализации так до сих пор и не было найдено :-\.

Не по теме:

Мой юбилейный сотый пост :)

0
 Аватар для BitFields
49 / 47 / 1
Регистрация: 03.08.2009
Сообщений: 101
18.11.2009, 20:53
Да что-то я не понимаю где проблема визуализации? Вроде все корректно работает...

Добавлено через 57 минут
Может попробовать обновить сортировку и группировку при событии SourceUpdated, которое происходит при изменении любого свойства привязанного к данному элементу(в данном случае ListBox)
0
 Аватар для BitFields
49 / 47 / 1
Регистрация: 03.08.2009
Сообщений: 101
18.11.2009, 23:08
Цитата Сообщение от BitFields Посмотреть сообщение
Да что-то я не понимаю где проблема визуализации? Вроде все корректно работает...

Добавлено через 57 минут
Может попробовать обновить сортировку и группировку при событии SourceUpdated, которое происходит при изменении любого свойства привязанного к данному элементу(в данном случае ListBox)
Нашел способ обновить данные в ListBox после сортировки и группировки, только для этого я запрограммировал код на нажатие кнопки.
0
 Аватар для BitFields
49 / 47 / 1
Регистрация: 03.08.2009
Сообщений: 101
21.12.2009, 13:46
TestClass также должен наследоваться от интерфейса IEditableObject,
тогда будет после изменения и редактирования произойдет сортировка и группировка.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.12.2009, 13:46
Помогаю со студенческими работами здесь

Группировка данных
Добрый день. Новичок в WPF. Можно ли сгруппировать несколько grid. Что бы у меня была группа из гридов. Что бы я мог их скрыть одной...

Сортировка/группировка данных в сводной таблице
Помогите пожалуйста с сортировкой, группировкой данных в сводной таблице

Событие после изменения данных привязанных к DataGridView
С помощью DataGridView я отображаю записи, однако информация о них одновременно частично отображается и в другом месте (которую приходится...

Сортировка и группировка
Добрый день. Код привожу с сокращениями. Делаю запрос: SELECT operitems.ORD ord, job.DATE job_date, job.ID job_id FROM okb_db_operitems...

Сортировка и группировка
Есть гипотетическая задача: Несколько пользователей отвечают на тест из 9-ти вопросов. (Предположительно у каждого ответа есть свой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru