none
Добавление столбца в DataGrid WPF RRS feed

  • Вопрос

  • Позволю себе несколько абстрагироваться от конкретной реализации. Поэтому допустим, что в объект table1_DataGrid данные загружаются из таблицы table1 БД. Задача заключается в том, чтобы в другом объекте table2_DataGrid предоставить пользователю возможность поработать над данными из table1_DataGrid, добавив туда дополнительные столбцы и затем сохранив эти данные в другой таблице table2. Данные из table1_DataGrid в объект table2_DataGrid, допустим загружаются с помощью следующего кода(в действительности данные подгружаются несколько по-другому):
    table2_DataGrid.ItemSource=table1_DataGrid.ItemSource;
    

    Теперь пытаемся добавить необходимый дополнительный столбец в table2_DataGrid:

    table2_DataGrid.Columns.Add(new DataGridTextColumn());
    


    И все бы было хорошо, визуально новый столбец добавился, доступен для редактирования, НО вводим туда данные, завершаем ввод, ячейка теряет фокус ввода и "данных как-будто бы и не было" в ячейке. Как понимаю, не выделяется память под хранение данных в этой ячейке. Почему так происходит и как можно добавить новый столбец в DataGrid, чтобы пользователь без проблем мог вводить туда некоторые данные?

    P.S.В действительности данные загружаются в table2_DataGrid из элементов TextBox следующим образом:

    DataTable dt=null;
    if (table2_DataGrid.ItemsSource == null)
                {
                    dt = new DataTable();
    
                    dt.Columns.Add("field1");
                    dt.Columns.Add("field2");
    
                    dt.Rows.Add(filed1_textBox.Text, field2_textBox.Text);
    
                    table2_DataGrid.Items.Clear();
                    table2_DataGrid.ItemsSource = dt.AsDataView();
                }
                else
                {
                    dt = (table2_DataGrid.ItemsSource as DataView).Table;
                    dt.Rows.Add(filed1_textBox.Text, field2_textBox.Text);
                }
    

    данные в TextBox'ы загружаются по определенному параметру из БД.

    29 сентября 2011 г. 11:59

Ответы

  • У вас данные должны добавляться через байндинги, тогда все будет работать. У каждой колонки есть свойство Binding. Вот к нему нужно байндить нужное поле. Если хотите, чтобы было все автоматически, попробуйте использовать AutoGenerateColumns

    • Изменено Anton.MaksimovEditor 29 сентября 2011 г. 12:20
    • Помечено в качестве ответа Maximys33 2 октября 2011 г. 5:50
    29 сентября 2011 г. 12:18
    Отвечающий

Все ответы

  • У вас данные должны добавляться через байндинги, тогда все будет работать. У каждой колонки есть свойство Binding. Вот к нему нужно байндить нужное поле. Если хотите, чтобы было все автоматически, попробуйте использовать AutoGenerateColumns

    • Изменено Anton.MaksimovEditor 29 сентября 2011 г. 12:20
    • Помечено в качестве ответа Maximys33 2 октября 2011 г. 5:50
    29 сентября 2011 г. 12:18
    Отвечающий
  • У вас данные должны добавляться через байндинги, тогда все будет работать. У каждой колонки есть свойство Binding. Вот к нему нужно байндить нужное поле. Если хотите, чтобы было все автоматически, попробуйте использовать AutoGenerateColumns

    Дело в том, что свойство AutoGenerateColumns установлено в значение true, т.е. столбцы должны добавляться автоматически, но этого почему-то не происходит! Привожу небольшую вырезку из XAML-кода окна:

    <Window x:Class="WpfApplication4.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" xmlns:my="http://schemas.microsoft.com/wpf/2008/toolkit">
        <Grid>
            <Button Content="Button" Height="101" HorizontalAlignment="Left" Margin="288,210,0,0" Name="button2" VerticalAlignment="Top" Width="71" Click="button2_Click" />
            <DataGrid Height="125" HorizontalAlignment="Left" Margin="52,21,0,0" Name="table2_DataGrid" VerticalAlignment="Top" Width="324" AutoGenerateColumns="True" CanUserAddRows="False" />
            <Button Content="Button" Height="17" HorizontalAlignment="Left" Margin="38,176,0,0" Name="button1" VerticalAlignment="Top" Width="17" Click="button1_Click" />
            <TextBox Height="23" HorizontalAlignment="Left" Margin="112,195,0,0" Name="field1_textBox" VerticalAlignment="Top" Width="120" />
            <TextBox Height="23" HorizontalAlignment="Left" Margin="300,174,0,0" Name="field2_textBox" VerticalAlignment="Top" Width="120" />
        </Grid>
    </Window>
    
    Сам был крайне удивлен, почему "не работает" свойство AutoGenerateColumns, но это так(или что-то понимаю не до конца).

    29 сентября 2011 г. 12:36
  • У меня работает нормально следующий код (редактируется и после потери фокуса данные остаются отредактированные):

     

    <DataGrid AutoGenerateColumns="True" Name="grid"></DataGrid>
    

    public partial class MainWindow : Window
        {
            private DataTable dt;
            public MainWindow()
            {
                InitializeComponent();
    
                dt = new DataTable();
    
                dt.Columns.Add("ID");
                dt.Columns.Add("Name");
    
                for (int i = 0; i < 100; i++)
                {
                    dt.Rows.Add(i, "Name" + i);
                }
    
                grid.ItemsSource = dt.DefaultView;
            }
        }
    


     

    29 сентября 2011 г. 13:15
    Отвечающий
  • Ваш код по добавлению данных в датагрид из текстовых полей работает нормально, столбцы генерируются, отображают данные и нормально данные можно изменять.

    <Window x:Class="WpfApplication11.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">
        <Grid>
            <DataGrid AutoGenerateColumns="True" CanUserAddRows="False" Height="200" HorizontalAlignment="Left" Margin="33,31,0,0" Name="grid" VerticalAlignment="Top" Width="200" />
            <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="281,128,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
            <TextBox Height="23" HorizontalAlignment="Left" Margin="262,70,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" />
            <TextBox Height="23" HorizontalAlignment="Left" Margin="262,99,0,0" Name="textBox2" VerticalAlignment="Top" Width="120" />
        </Grid>
    </Window>
    
    

     

            private void button1_Click(object sender, RoutedEventArgs e)
            {
                DataTable dt = null;
                if (grid.ItemsSource == null)
                {
                    dt = new DataTable();
    
                    dt.Columns.Add("field1");
                    dt.Columns.Add("field2");
    
                    dt.Rows.Add(textBox1.Text, textBox2.Text);
    
                    grid.Items.Clear();
                    grid.ItemsSource = dt.AsDataView();
                }
                else
                {
                    dt = (grid.ItemsSource as DataView).Table;
                    dt.Rows.Add(textBox1.Text, textBox2.Text);
                }
            }
    

     


    Для связи [mail]
    29 сентября 2011 г. 14:55