Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Помогите с DataGrid

85K
22 октября 2012 года
balash94
6 / / 22.10.2012
Добрый вечер. Я использую wpf. На форме у меня есть DataGrid, к нему я привязал List. Когда я добавляю элементы в мой List (+ dataGrid1.Items.Refresh ()) они появляются в dataGrid. Но, если я предварительно отсортировал элементы (кликнув по заголовку столбца), то dataGrid1.Items.Refresh () уже не помогает, а элементы появляются только при следующей сортировке. Как обновить элементы (но что бы сортировка не исчезла)?
  • Язык? Платформа?? Фреймворк??? @#$! от koodeer, 24 октября 2012 года
392
26 октября 2012 года
cronya
421 / / 03.01.2009
Навскидку должно быть так

Код:
<Window x:Class="WpfApplication1.MainWindow"
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       Title="MainWindow" Height="350" Width="525" SizeToContent="Manual">
    <Grid>      
        <DataGrid AutoGenerateColumns="false" HorizontalAlignment="Stretch" Name="dataGrid1" VerticalAlignment="Stretch" Margin="0,22,0,0">
                   
        </DataGrid>
        <Button Content="Добавить" Height="23" HorizontalAlignment="Left" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
    </Grid>
</Window>
Код:
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;

namespace WpfApplication1
{
    /// <summary>
    /// Логика взаимодействия для MainWindow.xaml
    /// </summary>
   
    public partial class MainWindow : Window
    {      
        public MainWindow()
        {
            InitializeComponent();
            AddColumn("Num");
            AddRow(1);
            AddRow(2);
            AddRow(3);
        }

        private class ItemN
        {
            public int Num { get; set; }
        }
       
        private void AddColumn(string name)
        {
            DataGridTextColumn newColumn = new DataGridTextColumn();
            newColumn.Header = name;
            newColumn.Binding = new Binding(name);
            dataGrid1.Columns.Add(newColumn);

        }

        private void AddRow(int value)
        {
            dataGrid1.Items.Add(new ItemN() { Num = value });    
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            AddRow(4);
        }
       
    }
}
сделал по простому чтобы было видно
84K
23 октября 2012 года
Rusnekromant
6 / / 23.10.2012
в winform у дата грида есть кроме refresh еще refitch (ну или как то там) вторая процедура не просто перерисовывает а перечитывает sourse но только дополнительно сбрасываются сортировки и прочие настройки, тоесть можно сказать по действию как будто заново инициализируеться. Поищи может поможет. Напиши если найдешь ответ, мне тоже может понадобиться)))
85K
24 октября 2012 года
balash94
6 / / 22.10.2012
Не нашол
84K
25 октября 2012 года
Rusnekromant
6 / / 23.10.2012
Эмммммм и правда нет, сорь. Ну если тебе нада решение но не самое хорошее то могу предложить просто запомнить сортировку, сбросить сортировку, а потом опять восстановить. Скорее всего при сортировке грид переходит в режим редактирования и ему пох Sourse который привязан к нему, а когда применяешь сортировку он таки перечитывает.
392
25 октября 2012 года
cronya
421 / / 03.01.2009
balash94, вам надо сделать новый обработчик событий для ColumnHeader!

Код:
private void HMDC(object sender, DataGridViewCellMouseEventArgs e)//ColumnHeaderMouseDoubleClick - ваше событие, в данном случаи двойной щелчок мыши по Хедер колонки
        {

            /*тут ваша сортировка  или что там у вас
                 .
                 .
                 .
                 .
                 .
                 .
            */

        /*а здесь делаете обновление DatGrid*/
            this.DataGrid.EndEdit();
            this.DataGrid.Refresh();
            this.DataGrid.ClearSelection();
        }
85K
26 октября 2012 года
balash94
6 / / 22.10.2012
Цитата: cronya
balash94, вам надо сделать новый обработчик событий для ColumnHeader!

Код:
private void HMDC(object sender, DataGridViewCellMouseEventArgs e)//ColumnHeaderMouseDoubleClick - ваше событие, в данном случаи двойной щелчок мыши по Хедер колонки
        {

            /*тут ваша сортировка  или что там у вас
                 .
                 .
                 .
                 .
                 .
                 .
            */

        /*а здесь делаете обновление DatGrid*/
            this.DataGrid.EndEdit();
            this.DataGrid.Refresh();
            this.DataGrid.ClearSelection();
        }



Не нашол ColumnHeaderMouseDoubleClick...

392
26 октября 2012 года
cronya
421 / / 03.01.2009
Так прошу прощения у вас wpf, не обратил внимание. Киньте код ваш глянем - именно как вы добавляете данные в datagrid. От сюда и будем плясать.
85K
26 октября 2012 года
balash94
6 / / 22.10.2012
....
<DataGrid.Columns>
<DataGridTextColumn Header="Група" IsReadOnly="True" Binding="{Binding Path=group}"/>
<DataGridTextColumn Header="Назва товару" IsReadOnly="True" Binding="{Binding Path=name}"/>
<DataGridTextColumn Header="Виробник" IsReadOnly="True" Binding="{Binding Path=producer}"/>
<DataGridTextColumn Header="Ціна" IsReadOnly="True" Width="100" Binding="{Binding Path=prise}"/>
<DataGridTextColumn Header="Кількість" IsReadOnly="True" Width="100" Binding="{Binding Path=count}"/>
<DataGridTextColumn Header="Сума" IsReadOnly="True" Width="100" Binding="{Binding Path=sum}"/>
</DataGrid.Columns>
...
[Serializable]
class Sclad
{
public Sclad(string s1, string s2, string s3, double s4, int s5)
{
group = s1;
name = s2;
producer = s3;
count = s5;
prise = s4;
sum = count * prise;
}
public string group { get; set; }
public string name { get; set; }
public string producer { get; set; }
public int count { get; set; }
public double prise { get; set; }
public double sum { get; set; }
}
...
List<Sclad> rows = new List<Sclad>();
Привязка dataGrid1.ItemsSource = rows;
...
Добавление елемента
rows.Add(new Sclad(textBox1.Text, textBox2.Text, textBox3.Text, price, Convert.ToInt32(textBox5.Text)));
dataGrid1.Items.Refresh();

Я только начинаю учить wpf, поэтому возможно что-то неправильно делаю
85K
26 октября 2012 года
balash94
6 / / 22.10.2012
Что интересно: у меня два DataGrid на форме привязаны к rows. Когда я заново сортирую в одном из них, то данные обновляются и в другом с той же сортировкой... Как сделать их независимыми?
85K
26 октября 2012 года
balash94
6 / / 22.10.2012
Ясно, отличие лишь в том, что я использовал List, а нужно сразу забрасывать в dataGrid1.Items. А если написать:
private void AddRow(int value)
{
dataGrid1.Items.Add(new ItemN() { Num = value });
dataGrid1.Items.Refresh();
}
то заново отсортироютса элементы.

Всем большое спасибо за помощь. Извините если где-то пишу с ошибками, мой родной язык - украинский.
И все же интересно почему с List не работает.
392
27 октября 2012 года
cronya
421 / / 03.01.2009
Проблема не в списке который вы используете, а в ItemsSourse(там свои плюшки, их надо вычитывать в MSDN)
Со списком все также просто:


Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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;

namespace WpfApplication2
{
    /// <summary>
    /// Логика взаимодействия для MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            AddColumn("Num");
            AddToList();
            GetFromList();
        }

        private List<ItemN> Data = null;

        private class ItemN
        {
            public int Num { get;set; }
        }

        private void AddColumn(string name)
        {
            DataGridTextColumn newColumn = new DataGridTextColumn();
            newColumn.Header = name;
            newColumn.Binding = new Binding(name);            
            dataGrid1.Columns.Add(newColumn);            
        }

        private void AddToList()
        {
            Data = new List<ItemN>();
            for (int idx = 0; idx < 5; idx++)
            {
                Data.Add(new ItemN { Num = idx });
            }            
        }

        private void GetFromList()
        {
           
            for (int idx = 0; idx < Data.Count; idx++)
            {
                dataGrid1.Items.Add(new ItemN() { Num = Data[idx].Num });
            }
        }

        private void AddRow(int value)
        {
            dataGrid1.Items.Add(new ItemN() { Num = value });
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            AddRow(5);
        }
    }
}
392
27 октября 2012 года
cronya
421 / / 03.01.2009
Хотя:) с ItemsSourse можно и так слукавить:

Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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;

namespace WpfApplication2
{
    /// <summary>
    /// Логика взаимодействия для MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            AddColumn("Num");
            AddToList();
            GetFromList();
        }

        private List<ItemN> Data = null;

        private class ItemN
        {
            public int Num { get;set; }
        }

        private void AddColumn(string name)
        {
            DataGridTextColumn newColumn = new DataGridTextColumn();
            newColumn.Header = name;
            newColumn.Binding = new Binding("Num");
            dataGrid1.Columns.Add(newColumn);            
        }

        private void AddToList()
        {
            Data = new List<ItemN>();
            for (int idx = 0; idx < 5; idx++)
            {
                Data.Add(new ItemN { Num = idx });
            }            
        }

        private void GetFromList()
        {
            dataGrid1.ItemsSource = Data;
        }

        private void AddRow(int value)
        {
            dataGrid1.Items.Add(new ItemN() { Num = value });
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            Data.Add(new ItemN { Num = 10 });
            dataGrid1.ItemsSource = null;
            dataGrid1.ItemsSource = Data;
        }
    }
}
вам просто остается доработать так чтобы отсортированные элементы оставались и к ним добавлялся новый в конец :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог