Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/34: Рейтинг темы: голосов - 34, средняя оценка - 4.74
0 / 0 / 0
Регистрация: 25.07.2016
Сообщений: 52

Добавление строк пользователем в DataGrid

15.04.2019, 20:05. Показов 6884. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как добавить выбранное в TextBlock количество строк, так что бы их можно было потом редактировать. Я так понимаю для этого нужно сделать привязку к коллекции. Добавленные строки надо записать в List<double>.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.04.2019, 20:05
Ответы с готовыми решениями:

Доступ к элементам Custom DataGrid и добавление новых элементов пользователем
добрый день форумчане, я сделал кастомный datagrid, который помимо стандартых элементов имеет поле для заголовка и Панель редактирования -...

DataGrid динамическое добавление строк
Я перехожу на WPF с Windows Forms. Аналогом DataGridView в данной технологии является DataGrid. Возникли следующие вопросы: 1) я задал...

Добавление, сохранение и удаление строк в DataGrid
Как можно сделать чтоб в datagrid через кнопку можно было удалить выделенную строку или определенный столбец? Как еще можно сделать в...

16
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
15.04.2019, 20:39
Цитата Сообщение от srs Посмотреть сообщение
Как добавить выбранное в TextBlock количество строк,
Ответ такой же как в Вашей теме Редактирование пользователем в DataGrid
1
0 / 0 / 0
Регистрация: 25.07.2016
Сообщений: 52
15.04.2019, 21:18  [ТС]
Спасибо. Привязал Grid к ObservableCollection. Могу редактировать но не могу сохранять изменения строки в коллекцию. И возможно ли ObservableCollection будет привести к двумерному массиву?

Добавлено через 30 минут
upd. Как привести разобрался. Как сохранять данные введенные пользователем?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
15.04.2019, 22:49
Лучший ответ Сообщение было отмечено Элд Хасп как решение

Решение

Цитата Сообщение от srs Посмотреть сообщение
Как сохранять данные введенные пользователем?
Сохраняйте коллекцию - все данные там.

В самом простом случает, Model состоит из сериализуемых классов и по команде сохранить/загрузить сериализуется/десериализуется вся Model целиком.

Добавлено через 1 минуту
Цитата Сообщение от srs Посмотреть сообщение
И возможно ли ObservableCollection будет привести к двумерному массиву?
Это очень редкий сценарий.
Для чего Вам подобное понадобилось?
Возможно, Вы выбрали неверный путь реализации.
0
0 / 0 / 0
Регистрация: 25.07.2016
Сообщений: 52
15.04.2019, 23:08  [ТС]
Я создаю привязку так CoorTableX.ItemsSource = coordX; Так же из того что я нашел, чтобы сохранять введенные данные в ЗАМЛе мы должны написать DataGridTemplateColumn, но когда я так делаю мне выбивает такой exception DataGridTemplateColumn. Сейчас мой код такой.
Кликните здесь для просмотра всего текста

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
public MainWindow()
    {
      InitializeComponent();
      //List<double> list = new List<double>();
      CoorTableX.ItemsSource = coordX;
      CoorTableY.ItemsSource = coordY;
    }
public ObservableCollection<double> coordX = new ObservableCollection<double>();
    public ObservableCollection<double> coordY = new ObservableCollection<double>();
 
    private void PeaksCount_KeyUp_1(object sender, KeyEventArgs e)
    {
      
      if (e.Key == Key.Enter)
      {
 
        double temp = 0;
        coordX.Add(temp);
        coordY.Add(temp);
        //for (int i = 0; i < Convert.ToInt32(PeaksCount.Text); i++)
        //{
        //  CoorTable.Items.Add(data);
        //}
      }
    }
 private void PeaksCount_GotFocus(object sender, RoutedEventArgs e)
    {
      PeaksCount.Clear();
    }

Кликните здесь для просмотра всего текста

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<DataGrid  CanUserAddRows="True" AutoGenerateColumns="False" DataGrid.IsReadOnly ="False" x:Name="CoorTableX" HorizontalAlignment="Left" Height="122" Margin="533,144,0,0" VerticalAlignment="Top" Width="71">
            <DataGridTemplateColumn   Header="X" Width="150" CanUserResize="False" CanUserReorder="False">
                
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock  Margin="2" VerticalAlignment="Center"  x:Name="x" Text="{Binding Path=coordX,Mode=TwoWay}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid>
        <DataGrid  CanUserAddRows="True" AutoGenerateColumns="False" DataGrid.IsReadOnly ="False" x:Name="CoorTableY" HorizontalAlignment="Left" Height="122" Margin="604,144,0,0" VerticalAlignment="Top" Width="89">
            <DataGrid.Columns >
                <DataGridTextColumn Header="Y" Width="*">
                </DataGridTextColumn>
 
            </DataGrid.Columns>
        </DataGrid>


Привести коллекцию к двумерному массиву надо потому что, сам обсчет задачи требует на входе двумерный массив. Сейчас по факту я сделал 2 DataGrid один для X второй для Y. После я приведу коллекцию к 2-м массивам, все еще не двумерный, но хоть что-то.
P.S. Возможно мне вообще DataGrid не нужен, я в с WPF знаком только 5 дней как. Все что нужно это взять у пользователя заданное количество координат (задает их количество пользователь) и найти периметр.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
16.04.2019, 02:42
Цитата Сообщение от srs Посмотреть сообщение
Привести коллекцию к двумерному массиву надо потому что, сам обсчет задачи требует на входе двумерный массив.
Вот давайте пока на этом остановимся.

Вы уже здесь неверно представляете архитектуру приложения в целом. А раз сама архитектура неправильна, то, сами понимаете, реализация как минимум будет "кривой".

Раз Вам для расчёта нужен двумерный массив, то есть Ваш тип основной данных. Он будет у Вас в Model.
А вот как его отображать, к какому типу для этого надо привести - это уже вторичный вопрос.

Поэтому давайте сначала разберёмся с Моделью.
Что за расчёты у Вас с данными? Мне не нужен их алгоритм. Нужно какие типы исходных данных, какие получаются типы расчётных данных. И коротко, смысл методов, чтобы я мог понять что с чем согласуется/стыкуется/связывается и т.п.
0
0 / 0 / 0
Регистрация: 25.07.2016
Сообщений: 52
16.04.2019, 03:20  [ТС]
Если кратко, то у меня есть класс (написан не мной), для своей работы он требует двумерный массив, где i = х координате,а j =у коорд. В классе реализован метод Calc что возвращает значение типа double. Это значение нужно вывести пользователю. Соответственно координаты (и их количество) задает пользователь. Мне нужно только взять эти координаты.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
16.04.2019, 10:20
Цитата Сообщение от srs Посмотреть сообщение
для своей работы он требует двумерный массив, где i = х координате,а j =у коорд.
Это одномерный массив. Или в крайнем случае это двумерный с постоянным количеством колонок = 2.
Я Вас правильно понял?

Если да, то подобное появляется из-за плохого применения ООП.

В ООП вместо массива double[n,2] (где n - количество координат, double[i, 0] - координата X, double[i, 1] - координата Y), должен применяться Coord[n], где Coord - название типа имеющего свойства X и Y.
Цитата Сообщение от srs Посмотреть сообщение
Если кратко,
Не надо кратко, если Вы хотите конкретной помощи, а не общих советов.
Что за двумерный массив? Вариантов может быть много. Один из них я описал выше - когда используется две колонки для задания X и Y.
Может быть ещё реализация, когда, допустим, задаётся рельеф местности. В этом случае используется двумерный миссив с произвольными размерами, а значение элемента - это высота.

Может быть ещё множество реализаций. Я же не могу гадать, что у Вас там.
0
0 / 0 / 0
Регистрация: 25.07.2016
Сообщений: 52
16.04.2019, 12:55  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Это одномерный массив. Или в крайнем случае это двумерный с постоянным количеством колонок = 2.
Я Вас правильно понял?
Если да, то подобное появляется из-за плохого применения ООП.
В ООП вместо массива double[n,2] (где n - количество координат, double[i, 0] - координата X, double[i, 1] - координата Y), должен применяться Coord[n], где Coord - название типа имеющего свойства X и Y.
Попросил переделать класс. Теперь для выполнения обсчета ему нужно в конструктор передать количество вершин (int), *после необходимо передать в кдасс два массива int[] coordX и int[] coordY.* Передать количество вершин как и передать координаты не проблема, вопрос как взять у пользователя координаты точек?
*Реализовано должно быть так. Координаты устанавливаются через setter полей int[]X и int[]Y соответственно.

Добавлено через 5 минут
P.S. можно считать что ничего не реализовано, т.к. даже то что уже реализовано работает очень криво.

Добавлено через 25 минут
UPD. Пока что все реализовано так.
Кликните здесь для просмотра всего текста

XML
1
2
3
4
5
<TextBox x:Name="CoordTBX" HorizontalAlignment="Left" Height="23" Margin="456,85,0,0" TextWrapping="Wrap" Text="Х" VerticalAlignment="Top" Width="120" GotFocus="CoordTBX_GotFocus"/>
        <TextBox x:Name="CoordTBY" HorizontalAlignment="Left" Height="23" Margin="581,85,0,0" TextWrapping="Wrap" Text="Y" VerticalAlignment="Top" Width="120" GotFocus="CoordTBY_GotFocus"/>
        <Button x:Name="CoordSendBN" Grid.ColumnSpan="2" Content="Отправить" HorizontalAlignment="Left" Margin="707,85,0,0" VerticalAlignment="Top" Width="75" Click="CoordSendBN_Click"/>
        <Button x:Name="CoordResBN" Content="Расчет" HorizontalAlignment="Left" Margin="552,145,0,0" VerticalAlignment="Top" Width="75" Click="CoordResBN_Click"/>
        <TextBox x:Name="CoordResTB" HorizontalAlignment="Left" Height="23" Margin="518,205,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="120"/>

Кликните здесь для просмотра всего текста

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
private List<int> xCoord = new List<int>();
    private List<int> yCoord = new List<int>();
 
    private void CoordTBX_GotFocus(object sender, RoutedEventArgs e)
    {
      CoordTBX.Clear();
    }
 
    private void CoordTBY_GotFocus(object sender, RoutedEventArgs e)
    {
      CoordTBY.Clear();
    }
 
    private void CoordSendBN_Click(object sender, RoutedEventArgs e)
    {
      int x = Convert.ToInt32(CoordTBX.Text);
      int y = Convert.ToInt32(CoordTBY.Text);
      xCoord.Add(x);
      yCoord.Add(y);
    }
 
    private void CoordResBN_Click(object sender, RoutedEventArgs e)
    {
      int[] x;
      x = xCoord.ToArray();
      int[] y;
      y = yCoord.ToArray();
      int peaks = 0;
      if (xCoord.Capacity == yCoord.Capacity)
      {
        peaks = xCoord.Capacity;
      }
      else
      {
        MessageBox.Show("Количество вершин должно быть одинаковым, введите значения еще раз");
        xCoord.Clear();
        yCoord.Clear();
        return;
      }
      Area area = new Area(peaks);
      area.X = x;
      area.Y = y;
      area.CalcArea();
      double result = area.Result;
      CoordResTB.Text = result.ToString();
    }

Хотелось бы сделать тоже самое но через DataGrid, что бы иметь возможность визуально видеть все введенные вершины, и редактировать их при необходимости.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
16.04.2019, 15:19
Цитата Сообщение от srs Посмотреть сообщение
опросил переделать класс. Теперь для выполнения обсчета ему нужно в конструктор передать количество вершин (int), *после необходимо передать в кдасс два массива int[] coordX и int[] coordY.* Передать количество вершин как и передать координаты не проблема, вопрос как взять у пользователя координаты точек?
*Реализовано должно быть так. Координаты устанавливаются через setter полей int[]X и int[]Y соответственно.
Блин!
Мы как будто на разных языках разговариваем!
Зачем переделывать Модель?
Тем более что это переделка всё равно не правильная!

Исходя из того, что Вы написали и моих додумываний, Вам надо передать в метод последовательность координат точек на двумерной поверхности. Так?

Если да, то для координат точек в Net есть специальные типы:
Для последовательностей применяется тип IEnumerable<T>.

В Вашем случае, хоть Вы и работаете с целыми значениями лучше всего подойдёт System.Windows.Point, и, соответственно, последовательность из списка List<Point> или ObservableCollection<Point> Подключив такую коллекцию к DataGrid Вы автоматически получите две колонки, соответственно, для X и Y.

Единственное у Point нет открытого безпараметрического конструктора, поэтому с новой строкой чуть труднее.

Я сейчас занят - напишу позднее как с этим быть.

Пока ответьте - правильно ли я понял что Вам надо для расчёта?
1
0 / 0 / 0
Регистрация: 25.07.2016
Сообщений: 52
16.04.2019, 15:25  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Пока ответьте - правильно ли я понял что Вам надо для расчёта?
Да List<point> подойдет. Я совершенно забыл про point. Заранее спасибо.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
16.04.2019, 15:42
Цитата Сообщение от srs Посмотреть сообщение
Да List<point> подойдет. Я совершенно забыл про point. Заранее спасибо.
С учётом WPF - лучше ObservableCollection<Point>

Добавлено через 15 минут
Вам лучше всего сделать свой класс - обход на ограничения создания новой строки при отсутствии безпараметрического конструктора - геморрой.
Свой класс (или структура) очень простой
C#
1
2
3
4
5
public class PointD 
{
    public double X {get; set; }
    public double Y {get; set; }
}
0
0 / 0 / 0
Регистрация: 25.07.2016
Сообщений: 52
16.04.2019, 15:44  [ТС]
Если лучше то, ок. Я так понимаю что при помощи метода CopyTo можно будет ObservableCollection<Point> записать в Point[]?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
16.04.2019, 15:45
Лучший ответ Сообщение было отмечено Элд Хасп как решение

Решение

Тем более что с учётом WPF лучше сразу реализовать INPC. Проще на основе OnProperyChangeClass - его реализаций много в разделе. Выберите удобную для Вас.
C#
1
2
3
4
5
6
7
8
public class PointD : OnProperyChangeClass 
{
    private double _x;
    private double _y;
 
    public double X {get => _x; set { _x = value;  OnProperyChange (); } }
    public double Y {get => _y; set { _y = value;  OnProperyChange (); } }
}
0
0 / 0 / 0
Регистрация: 25.07.2016
Сообщений: 52
16.04.2019, 15:47  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вам лучше всего сделать свой класс - обход на ограничения создания новой строки при отсутствии безпараметрического конструктора - геморрой.
Свой класс (или структура) очень простой
Если использовать ObservableCollection<Point>, то создавать класс не понадобится?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
16.04.2019, 15:54
Лучший ответ Сообщение было отмечено Элд Хасп как решение

Решение

Цитата Сообщение от srs Посмотреть сообщение
Я так понимаю что при помощи метода CopyTo можно будет ObservableCollection<Point> записать в Point[]?
А зачем?
Если нужна последовательная обработка элементов, то лучше всего использовать в методе IEnumerable.
Если так уж сильно нужно работать именно с индексами элементов, то преобразовать чем в массив (метод ToArray()) лучше в список - метод ToList()

Добавлено через 3 минуты
Цитата Сообщение от srs Посмотреть сообщение
создавать класс не понадобится?
Создать класс нужно для возможности добавления новых элементов в DataGrid.
Для этого тип элемента коллекции должен иметь безпараметрический конструктор. У дефолтного Point такого нет.
Поэтому для добавления новых точек придётся создавать специальную группу элементов.
Проще свой класс объявить.
1
0 / 0 / 0
Регистрация: 25.07.2016
Сообщений: 52
16.04.2019, 15:55  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Если так уж сильно нужно работать именно с индексами элементов, то преобразовать чем в массив (ToArray) лучше в список - метод ToList()
Просмотел этот метод. Да он будет лучше.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.04.2019, 15:55
Помогаю со студенческими работами здесь

Редактирование пользователем в DataGrid
Требуется что бы пользователь мог добавить строки (пока что это решил через запрос количества вершин в textbox), и редактировать их во...

[WPF] Заполнение DataGrid пользователем
Добрый день. Являюсь новичком в WPF. Задача простая - закинуть на форму DataGrid, чтобы пользователь её заполнял. DataGrid добавил, но он...

Функции работы со строками символов: определение размера строки, копирование строк, добавление строк, сравнение строк
На языке Ассемблер написать функции работы со строками символов: определение размера строки, копирование строк, добавление строк, сравнение...

[WPF] Как в DataGrid очистить ячейку с форматом Decimal в окне пользователем?
Здравствуйте, начал изучать WPF по разнообразным урокам, но никак не могу найти и понять как работает данная схема (возможно валидатор) ...

Написать программу, использующую стандартную функцию сравнения строк для определения среди трех строк, вводимых пользователем, одинаковых.
Написать программу, использующую стандартную функцию сравнения строк для определения среди трех строк, вводимых пользователем, одинаковых.


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru