Помогите с DataGrid
Добрый вечер. Я использую wpf. На форме у меня есть DataGrid, к нему я привязал List. Когда я добавляю элементы в мой List (+ dataGrid1.Items.Refresh ()) они появляются в dataGrid. Но, если я предварительно отсортировал элементы (кликнув по заголовку столбца), то dataGrid1.Items.Refresh () уже не помогает, а элементы появляются только при следующей сортировке. Как обновить элементы (но что бы сортировка не исчезла)?
- Язык? Платформа?? Фреймворк??? @#$! от koodeer, 24 октября 2012 года
Код:
<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>
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);
}
}
}
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);
}
}
}
в winform у дата грида есть кроме refresh еще refitch (ну или как то там) вторая процедура не просто перерисовывает а перечитывает sourse но только дополнительно сбрасываются сортировки и прочие настройки, тоесть можно сказать по действию как будто заново инициализируеться. Поищи может поможет. Напиши если найдешь ответ, мне тоже может понадобиться)))
Не нашол
Эмммммм и правда нет, сорь. Ну если тебе нада решение но не самое хорошее то могу предложить просто запомнить сортировку, сбросить сортировку, а потом опять восстановить. Скорее всего при сортировке грид переходит в режим редактирования и ему пох Sourse который привязан к нему, а когда применяешь сортировку он таки перечитывает.
Код:
private void HMDC(object sender, DataGridViewCellMouseEventArgs e)//ColumnHeaderMouseDoubleClick - ваше событие, в данном случаи двойной щелчок мыши по Хедер колонки
{
/*тут ваша сортировка или что там у вас
.
.
.
.
.
.
*/
/*а здесь делаете обновление DatGrid*/
this.DataGrid.EndEdit();
this.DataGrid.Refresh();
this.DataGrid.ClearSelection();
}
{
/*тут ваша сортировка или что там у вас
.
.
.
.
.
.
*/
/*а здесь делаете обновление DatGrid*/
this.DataGrid.EndEdit();
this.DataGrid.Refresh();
this.DataGrid.ClearSelection();
}
Цитата: cronya
balash94, вам надо сделать новый обработчик событий для ColumnHeader!
Код:
private void HMDC(object sender, DataGridViewCellMouseEventArgs e)//ColumnHeaderMouseDoubleClick - ваше событие, в данном случаи двойной щелчок мыши по Хедер колонки
{
/*тут ваша сортировка или что там у вас
.
.
.
.
.
.
*/
/*а здесь делаете обновление DatGrid*/
this.DataGrid.EndEdit();
this.DataGrid.Refresh();
this.DataGrid.ClearSelection();
}
{
/*тут ваша сортировка или что там у вас
.
.
.
.
.
.
*/
/*а здесь делаете обновление DatGrid*/
this.DataGrid.EndEdit();
this.DataGrid.Refresh();
this.DataGrid.ClearSelection();
}
Не нашол ColumnHeaderMouseDoubleClick...
Так прошу прощения у вас wpf, не обратил внимание. Киньте код ваш глянем - именно как вы добавляете данные в datagrid. От сюда и будем плясать.
<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, поэтому возможно что-то неправильно делаю
Что интересно: у меня два DataGrid на форме привязаны к rows. Когда я заново сортирую в одном из них, то данные обновляются и в другом с той же сортировкой... Как сделать их независимыми?
private void AddRow(int value)
{
dataGrid1.Items.Add(new ItemN() { Num = value });
dataGrid1.Items.Refresh();
}
то заново отсортироютса элементы.
Всем большое спасибо за помощь. Извините если где-то пишу с ошибками, мой родной язык - украинский.
И все же интересно почему с List не работает.
Со списком все также просто:
Код:
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);
}
}
}
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);
}
}
}
Код:
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;
}
}
}
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;
}
}
}