none
DataGrid изменение данных в нужной ячейке(строке,столбце) WPF RRS feed

  • Вопрос

  • Всем добрый день, помогите пожалуйста разобраться, есть таблица и нужно разрешить редактирование только в определенной ячейке, либо определенном столбце, строке. Всем спасибо кто заглянул
    16 ноября 2015 г. 8:13

Ответы

  • Добрый день.

    Как вариант, попробуйте подписаться на событие beginningedit смотрите, в какой вы ячейке и отменяйте через e.Cancel

    • Помечено в качестве ответа Ethernets 16 ноября 2015 г. 17:34
    16 ноября 2015 г. 9:27
    Отвечающий
  • Например, у меня есть табличка с сотрудниками, имя править нельзя, а стаж можно. Вот так это может выглядеть.

    Разметка формы:

    <Window x:Class="WpfApplication7.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApplication7"
            mc:Ignorable="d"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <DataGrid x:Name="dgMain" AutoGenerateColumns="False" BeginningEdit="dgMain_BeginningEdit" >
                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding Name}" Header="Имя" />
                    <DataGridTextColumn Binding="{Binding Experience,Mode=TwoWay}" Header="Стаж" />
                </DataGrid.Columns>
            </DataGrid>
        </Grid>
    </Window>
    

    Класс сотрудника:

    internal class Person
    {
        public string Name { get; set; }
    
        public int Experience { get; set; }
    }

    Ну и код формы, на событие Loaded я генерю данные, а в обработчике события BeginningEdit как раз и проверяю ячейка какого столбца сейчас редактируется:

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            Loaded += MainWindow_Loaded;
        }
    
        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            Person[] persons = new Person[3];
            persons[0] = new Person() { Name = "Иванов", Experience = 1 };
            persons[1] = new Person() { Name = "Петров", Experience = 5 };
            persons[2] = new Person() { Name = "Сидоров", Experience = 3 };
            dgMain.ItemsSource = persons;
        }
    
        private void dgMain_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
        {
            if (e.Column.DisplayIndex != 1)
            {
                e.Cancel = true;
            }
        }
    }

    Если эту программу запустить, то в первом столбце редактировать нельзя, а во втором можно.

    P.s. Если ваша проблема не решена, то вопрос не закрывайте. Если решена, но появились еще вопросы, то закройте исходный вопрос и создайте новый.

    • Помечено в качестве ответа Ethernets 18 ноября 2015 г. 10:02
    17 ноября 2015 г. 9:02
    Отвечающий
  • либо 2-й и 3-й и 9-10 например, я сделал такое условие правильно ли будет такое решение: 

    Если нужно редактировать только 2, 3, 9 и 10, то можно так:

    private void dgMain_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
    {
        if (!(new[] { 1, 2, 8, 9 }).Contains(e.Column.DisplayIndex))
        {
            e.Cancel = true;
        }
    }

    и еще один момент если IsReadOnly = "False"  тогда возникает возможность добавления столбцов пользователем, а мне для данной задачи это не нужно, а без IsReadOnly = "False" редактирование невозможно.

    Причем здесь IsReadOnly и добавление столбцов? Если вам нужно запретить добавление строк, то это CanUserAddRows

    P.s. Извините а как на этом форуме закрывать вопросы ?



    Пометить как ответ. Что вы и сделали на первом моем ответе, хотя, он вашу проблему не решил :)

    • Помечено в качестве ответа Ethernets 18 ноября 2015 г. 10:02
    18 ноября 2015 г. 6:37
    Отвечающий

Все ответы

  • Добрый день.

    Как вариант, попробуйте подписаться на событие beginningedit смотрите, в какой вы ячейке и отменяйте через e.Cancel

    • Помечено в качестве ответа Ethernets 16 ноября 2015 г. 17:34
    16 ноября 2015 г. 9:27
    Отвечающий

  • Вы меня простите за наглость, я только учусь, и пока не совсем понимаю как реализовать данную задачу, если вам будет не трудно и у вас будет время, не могли бы вы показать мне наглядно как это работает, в интернете про данное событие очень мало информации либо если она есть но не раскрывает мое решение, большое вам спасибо за ответ
    16 ноября 2015 г. 17:34
  • Например, у меня есть табличка с сотрудниками, имя править нельзя, а стаж можно. Вот так это может выглядеть.

    Разметка формы:

    <Window x:Class="WpfApplication7.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApplication7"
            mc:Ignorable="d"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <DataGrid x:Name="dgMain" AutoGenerateColumns="False" BeginningEdit="dgMain_BeginningEdit" >
                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding Name}" Header="Имя" />
                    <DataGridTextColumn Binding="{Binding Experience,Mode=TwoWay}" Header="Стаж" />
                </DataGrid.Columns>
            </DataGrid>
        </Grid>
    </Window>
    

    Класс сотрудника:

    internal class Person
    {
        public string Name { get; set; }
    
        public int Experience { get; set; }
    }

    Ну и код формы, на событие Loaded я генерю данные, а в обработчике события BeginningEdit как раз и проверяю ячейка какого столбца сейчас редактируется:

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            Loaded += MainWindow_Loaded;
        }
    
        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            Person[] persons = new Person[3];
            persons[0] = new Person() { Name = "Иванов", Experience = 1 };
            persons[1] = new Person() { Name = "Петров", Experience = 5 };
            persons[2] = new Person() { Name = "Сидоров", Experience = 3 };
            dgMain.ItemsSource = persons;
        }
    
        private void dgMain_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
        {
            if (e.Column.DisplayIndex != 1)
            {
                e.Cancel = true;
            }
        }
    }

    Если эту программу запустить, то в первом столбце редактировать нельзя, а во втором можно.

    P.s. Если ваша проблема не решена, то вопрос не закрывайте. Если решена, но появились еще вопросы, то закройте исходный вопрос и создайте новый.

    • Помечено в качестве ответа Ethernets 18 ноября 2015 г. 10:02
    17 ноября 2015 г. 9:02
    Отвечающий
  • Добрый вечер, большое спасибо вам за ваше потраченное время, спасибо за наглядный пример, возник еще вопрос - в вашем примере запрет на все столбцы кроме 2-го, а если мне нужно редактировать 2 столбца, например второй и третий, либо 2-й и 3-й и 9-10 например, я сделал такое условие правильно ли будет такое решение: 

    if (e.Column.DisplayIndex != 1 & e.Column.DisplayIndex != 4 & e.Column.DisplayIndex != 9)

    и еще один момент если IsReadOnly = "False"  тогда возникает возможность добавления столбцов пользователем, а мне для данной задачи это не нужно, а без IsReadOnly = "False" редактирование невозможно.

    P.s. Извините а как на этом форуме закрывать вопросы ?


    • Изменено Ethernets 17 ноября 2015 г. 16:05
    17 ноября 2015 г. 16:04
  • либо 2-й и 3-й и 9-10 например, я сделал такое условие правильно ли будет такое решение: 

    Если нужно редактировать только 2, 3, 9 и 10, то можно так:

    private void dgMain_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
    {
        if (!(new[] { 1, 2, 8, 9 }).Contains(e.Column.DisplayIndex))
        {
            e.Cancel = true;
        }
    }

    и еще один момент если IsReadOnly = "False"  тогда возникает возможность добавления столбцов пользователем, а мне для данной задачи это не нужно, а без IsReadOnly = "False" редактирование невозможно.

    Причем здесь IsReadOnly и добавление столбцов? Если вам нужно запретить добавление строк, то это CanUserAddRows

    P.s. Извините а как на этом форуме закрывать вопросы ?



    Пометить как ответ. Что вы и сделали на первом моем ответе, хотя, он вашу проблему не решил :)

    • Помечено в качестве ответа Ethernets 18 ноября 2015 г. 10:02
    18 ноября 2015 г. 6:37
    Отвечающий
  • Спасибо вам большое, ваша помощь решила мой вопрос.

     
    18 ноября 2015 г. 10:02
  • Пожалуйста. Будут вопросы, обращайтесь, постараемся помочь.
    18 ноября 2015 г. 10:03
    Отвечающий