Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.97/117: Рейтинг темы: голосов - 117, средняя оценка - 4.97
6 / 6 / 0
Регистрация: 20.03.2011
Сообщений: 67
1

Заполнение значения в определённой ячейке DataGrid

27.02.2013, 10:15. Показов 24285. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день, уважаемые форумчане! Не так давно стал изучать WPF. Возник один вопрос, который застопорил всю мою работу и изучение.
Допустим в программе есть метод в результате работы которого мы получаем число(или любые данные). Как это число(данные) передать нужной ячейке DataGrid таблицы.
Например, на Windows Form это было так:
C#
1
MyDataGridView.Rows[n].Columns("name").value = "наше число(данные)";
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.02.2013, 10:15
Ответы с готовыми решениями:

Два значения из БД в одной ячейке DataGrid
День добрый. Из БД берётся два значения цены из разных таблиц, надо что бы эти значения были...

Excel: как зафиксировать в определённой ячейке, какие-то меняющиеся значения из другой ячейки?
Имеются следующие условия: Файл Exсelа (2003) завязан с другой программой. Из этой программы идёт...

Datagrid в ячейке Datagrid c корректным отображением границ
Задача поместить связанные данные (две таблицы Sql связаны по id ) в виде таблицы ячейки одной их...

Ввод значения/редактирование в ячейке, дублирование всех действий в другой ячейке
Как-то давненько попадалась статья в интернете: при вводе данных в одну ячейку, например, текста, в...

12
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
27.02.2013, 10:40 2
Donix, ну вот пример, у меня генерируется коллекция, после этого она закидывается в датагрид. У меня в процессе работы коллекция не изменяется (то есть она ридонли) - может создастся только новая, поэтому я пишу такой код:
XML
1
2
3
4
5
6
7
8
9
10
            <DataGrid x:Name="ResultDataGrid" AutoGenerateColumns="False" IsReadOnly="True" ColumnWidth="56" LoadingRow="AddRowIndicies" HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto" SelectionMode="Single">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="a" Binding="{Binding A, Converter={StaticResource converter}}"/>
                    <DataGridTextColumn Header="b" Binding="{Binding B, Converter={StaticResource converter}}"/>
                    <DataGridTextColumn Header="λ" Binding="{Binding Left, Converter={StaticResource converter}}"/>
                    <DataGridTextColumn Header="μ" Binding="{Binding Right, Converter={StaticResource converter}}"/>
                    <DataGridTextColumn Header="F(λ)" Binding="{Binding Functionleft, Converter={StaticResource converter}}"/>
                    <DataGridTextColumn Header="F(μ)" Binding="{Binding Functionright, Converter={StaticResource converter}}"/>
                </DataGrid.Columns>
            </DataGrid>
коллекция таких элементов:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
namespace SingleParameterOptimization
{
    public class StepData
    {
        public double A { get; private set; }
        public double B { get; private set; }
        public double Left { get; private set; }
        public double Right { get; private set; }
        public double Functionleft { get; private set; }
        public double Functionright { get; private set; }
 
        public StepData(double a, double b, double left, double right, double functionleft, double functionright)
        {
            A = a;
            B = b;
            Left = left;
            Right = right;
            Functionleft = functionleft;
            Functionright = functionright;
        }
    }
}
А записываю в грид её я очень просто:
C#
1
ResultDataGrid.ItemsSource = task.ResultDetails;
где
C#
1
public IEnumerable<StepData> ResultDetails { get; private set; }
Если лениво писать такой XAML можно написать просто:
XML
1
<DataGrid x:Name="ResultDataGrid" AutoGenerateColumns="True">
3
6 / 6 / 0
Регистрация: 20.03.2011
Сообщений: 67
27.02.2013, 14:25  [ТС] 3
Psilon, спасибо за ответ! Но я не совсем понял, можете написать пример попроще, пожалуйста)

Добавлено через 1 час 24 минуты
Psilon, спасибо ещё раз! Примера не надо, я во всём разобрался, всё работает)))
0
63 / 63 / 14
Регистрация: 05.08.2011
Сообщений: 323
Записей в блоге: 5
27.02.2013, 14:53 4
Лучший ответ Сообщение было отмечено как решение

Решение

Donix, в отличии от Windows Forms, в WPF (и, к слову, в Silvrelight) очень широко применяется привязка данных. Я попробую пояснить то, что написал товарищ Psilon:
1. Имеется таблица со следующими параметрами:
- Имя: ResultDataGrid
- Автоматическая Генерация Колонок: отключена (т.к. далее он сам описывает какие колонки должны быть в таблице).
- Только для чтения: включено (пользователь не может, изменить её содержимое ячейки).
- Всякие визуальные параметры, определяющее положение таблицы внутри родительского элемента управления.
- Режим выбора - одиночный (то есть, пользователь не может выделить группу или ряд ячеек, а только одну)
- Набор столбцов, у которых указано: название заголовка и привязка данных с указанием конвертера.

В принципе, для начала, можно написать код, который последним представлен в его посте, а именно:
XML
1
<DataGrid x:Name="ResultDataGrid" AutoGenerateColumns="True">
Безо всяких конвертеров пока что. Тогда таблица сама сгенерирует все необходимые столбцы.

2. Поехали дальше - таблица должна содержать коллекцию данных. Это может быть тип IEnumerable<T>, List<T>, ObservableCollection<T>, и прочие. Суть в том, что это должна быть коллекция каких-то данных - шаблонных или пользовательских - как хотите. В случае вышеуказанного примера, это самодельный тип данных StepData.

3. Вы должны откуда-то получить эту коллекцию данных. Можете получить её из базы данных, xml файла или сами её создать прямо в коде:
C#
1
2
IEnumerable<StepData> ResultDetails = new List<StepData>()
    { new StepData(1,1,1,1,1,1), new StepData(2,2,2,2,2,2)};
Здесь я создал список объектов класса StepData и сразу же определил в нём 2 экземпляра StepData.

4. Коллекция есть. А теперь самое лёгкое:
C#
1
ResultDataGrid.ItemsSource = ResultDetails;
Свойство ItemsSource таблицы (да и многих других контейнеров) автоматически привязывается к коллекции ResultDetails. Теперь, если вы удалите данные из ResultDetails, то, автоматически эти данные пропадут и из таблицы. И наоборот, если я не ошибаюсь (с WPF давно не работал).

Указывая источник данных для свойства ItemsSource, автоматически присвается контекст данных. Поэтому, при создании столбца,
XML
1
<DataGridTextColumn Header="a" Binding="{Binding A, Converter={StaticResource converter}}"/>
Указывается, Binding (связь) с полем "А", соответствующим полем класса StepData. Если указать, скажем "AA", то этот столбец будет пустой, т.к. не найдет информации по своему контексту.

Почитайте статьи на темы: привязки данных, DataContext, DataGrid ItemsSource в рамках WPF. Вы будете почти всегда применять эти знания.




Запись в конкретную ячейку может быть затруднительна. Для этих целей я в свое время нашел очень полезный класс-помощник:
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
47
48
49
    public static class DataGridHelper
    {
        public static DataGridCell FindCell(int iRow, int iColumn, DataGrid dg)
        {
            return GetCell(new DataGridCellInfo(dg.Items[iRow], dg.Columns[iColumn]));
        }
 
        public static DataGridCell GetCell(DataGridCellInfo dataGridCellInfo)
        {
            if (!dataGridCellInfo.IsValid)
            {
                return null;
            }
 
            var cellContent = dataGridCellInfo.Column.GetCellContent(dataGridCellInfo.Item);
            if (cellContent != null)
            {
                return (DataGridCell)cellContent.Parent;
            }
            else
            {
                return null;
            }
        }
        public static int GetRowIndex(DataGridCell dataGridCell)
        {
            // Use reflection to get DataGridCell.RowDataItem property value.
            PropertyInfo rowDataItemProperty = dataGridCell.GetType().GetProperty("RowDataItem", BindingFlags.Instance | BindingFlags.NonPublic);
 
            DataGrid dataGrid = GetDataGridFromChild(dataGridCell);
 
            return dataGrid.Items.IndexOf(rowDataItemProperty.GetValue(dataGridCell, null));
        }
        public static DataGrid GetDataGridFromChild(DependencyObject dataGridPart)
        {
            if (VisualTreeHelper.GetParent(dataGridPart) == null)
            {
                throw new NullReferenceException("Control is null.");
            }
            if (VisualTreeHelper.GetParent(dataGridPart) is DataGrid)
            {
                return (DataGrid)VisualTreeHelper.GetParent(dataGridPart);
            }
            else
            {
                return GetDataGridFromChild(VisualTreeHelper.GetParent(dataGridPart));
            }
        }
    }
Таким образом, методом FindCell можно обратиться к конкретной ячейке, как в WindowsForms.

Добавлено через 6 минут
Аааа не увидел поста, что Вы уже разобрались . Зря пыхтел )
10
6 / 6 / 0
Регистрация: 20.03.2011
Сообщений: 67
27.02.2013, 15:26  [ТС] 5
Mans7, спасибо огромное за такой подробный обзор! С удовольствием прочитал :-)
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
27.02.2013, 15:47 6
Mans7, что значит зря? Замечательно все расписал. Молодец!)
0
9 / 8 / 2
Регистрация: 01.11.2013
Сообщений: 111
27.10.2014, 13:34 7
Бьюсь над такойже задачей только в VB. Кто бы мог перевести мне всё выше сказанное в VB стандарт((
0
164 / 144 / 49
Регистрация: 29.10.2014
Сообщений: 738
29.10.2014, 23:56 8
Прошу помощи, пример в чем то подобен, итак имеется файл Excel с данными большого размера 46 столбцов на 20000 строк (может варьироваться), необходимо получить данные (как можно быстрее) и загрузить в DataGrid.
Сам код:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<Window x:Class="WpfExcel.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>
        <Menu HorizontalAlignment="Left" Height="24" VerticalAlignment="Top" Width="517">
            <MenuItem Header="Файл" >
                <MenuItem Header="Открыть" Click="OpenClick" >
                    <MenuItem.Icon>
                        <Image Source="open.gif"/>
                    </MenuItem.Icon>
                </MenuItem>
            </MenuItem>
        </Menu>
        <DataGrid Name="MyDataGrid"  AutoGenerateColumns="True" 
                  HorizontalAlignment="Left" Margin="10,29,0,0" 
                  VerticalAlignment="Top" Height="251" Width="497"/>
    </Grid>
</Window>
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
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;
using Microsoft.Office.Interop.Excel;
using System.IO;
 
namespace WpfExcel
{
 
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : System.Windows.Window
    {
        private Microsoft.Office.Interop.Excel.Application ExcelApp;
        private Microsoft.Office.Interop.Excel.Workbook WorkBookExcel;
        private Microsoft.Office.Interop.Excel.Worksheet WorkSheetExcel;
        private Microsoft.Office.Interop.Excel.Range RangeExcel;
        public MainWindow()
        {
            InitializeComponent();
 
        }
 
        private void OpenClick(object sender, RoutedEventArgs e)
        {
            Microsoft.Win32.OpenFileDialog openDialog = new Microsoft.Win32.OpenFileDialog();
            openDialog.Filter = "Файл Excel|*.XLSX;*.XLS";
            var result = openDialog.ShowDialog();
            if (result == false)
            {
                MessageBox.Show("Файл не выбран!", "Информация", MessageBoxButton.YesNo, MessageBoxImage.Information);
                return;
            }
            string fileName = System.IO.Path.GetFileName(openDialog.FileName);
 
            ExcelApp = new Microsoft.Office.Interop.Excel.Application();
                //Книга.
            WorkBookExcel = ExcelApp.Workbooks.Open(openDialog.FileName);
                //Таблица.
                WorkSheetExcel = (Microsoft.Office.Interop.Excel.Worksheet)WorkBookExcel.Sheets[1];
 
                var lastCell = WorkSheetExcel.Cells.SpecialCells(Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeLastCell);
                string[,] list = new string[lastCell.Column, lastCell.Row];
            
            for(int i=0;i<(int)lastCell.Column;i++)
                for(int j=0;j<(int)lastCell.Row;j++)
                    list[i, j] = WorkSheetExcel.Cells[j + 1, i + 1].Text.ToString();//считал текст в строку
 
            WorkBookExcel.Close(false, Type.Missing, Type.Missing); //закрыл не сохраняя
            ExcelApp.Quit(); // вышел из Excel
            GC.Collect(); // убрал за собой
 
            MyDataGrid.ItemsSource = list;
        }
    }
}
Как видно из кода данные считывает (очень долго!!!), когда тестировал пример, с малым количеством данных они записываются в list, но долго считывает данные, как можно ускорить процесс и каким образом можно загрузить эти данные в DataGrid? Нужен совет и помощь.
0
2 / 2 / 2
Регистрация: 20.10.2014
Сообщений: 30
30.10.2014, 07:53 9
А это вот такая "великолепная" особенность работы с экселем из под вижуал студио)
0
164 / 144 / 49
Регистрация: 29.10.2014
Сообщений: 738
30.10.2014, 19:47 10
Вопрос еще актуален, как ускорить запись и скинуть в DataGrid? Нужен совет и помощь.

Добавлено через 11 часов 18 минут
Коллеги так, стоит ли обработку файлов Excel большой размерности выполнять в VS???
0
164 / 144 / 49
Регистрация: 29.10.2014
Сообщений: 738
09.11.2014, 18:59 11
Разобрался сам.
0
164 / 144 / 49
Регистрация: 29.10.2014
Сообщений: 738
13.11.2014, 21:52 12
Считал данный с файла, как загрузить данный в DataGrid, делаю так:
C#
1
2
3
4
5
 List<String> firstData;
 
ReadExcelFileMy(fileName, out firstData);
 
            MyDataGrid.ItemsSource = firstData;
Ошибка пишет: значения коллекции должны быть пусты перед использованием ItemsSource (Additional information: Items collection must be empty before using ItemsSource.)

Добавлено через 2 минуты
XML
1
2
3
4
5
6
<DataGrid Name="MyDataGrid"  AutoGenerateColumns="True" 
                  HorizontalAlignment="Left" Margin="10,29,0,0" 
                  VerticalAlignment="Top" Height="281" Width="497" >
            <DataGridTextColumn Header="DATA #1"/>
 
        </DataGrid>
0
0 / 0 / 0
Регистрация: 22.03.2018
Сообщений: 1
19.05.2018, 20:20 13
Доброго времени суток, не могли помочь с созданием и объявлением результатов в DataGrid C# wpf

XML
1
2
3
4
5
6
7
8
9
<DataGrid.Columns>
                <DataGridTextColumn Header="№" Width="25" B/>
                <DataGridTextColumn Header="Дата платежа" Binding="{Binding A, Converter={StaticResource converter}}"/>
                <DataGridTextColumn Header="Остаток долга после выплаты" Binding="{Binding B, Converter={StaticResource converter}}"/>
                <DataGridTextColumn Header="Погашение основного долга" Binding="{Binding Left, Converter={StaticResource converter}}"/>
                <DataGridTextColumn Header="Начисленные проценты" Binding="{Binding Right, Converter={StaticResource converter}}"/>
                <DataGridTextColumn Header="Сумма платежа" Binding="{Binding Functionleft, Converter={StaticResource converter}}"/>
            </DataGrid.Columns>
        </DataGrid>
C#
1
2
3
4
5
6
7
8
9
  public class Kredit
        {
            public int Number { get; private set; }
            public double Ostatok { get; private set; }
            public string Date { get; private set; }
            public double Osnovdolg { get; private set; }
            public double Procent { get; private set; }
            public double Platej { get; private set; }
        }
0
19.05.2018, 20:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.05.2018, 20:20
Помогаю со студенческими работами здесь

Ввод значения/редактирование в ячейке, дублирование всех действий в другой ячейке
Как-то давненько попадалась статья в интернете: при вводе данных в одну ячейку, например, текста, в...

Изменение значения в ячейке в зависимости от изменения в другой ячейке
Здравствуйте. Помогите составить формулу для решения вопроса. Допустим есть два столбца (А и В), в...

Изменение данных в ячейке на основании значения в соседней ячейке
Вот такая ситуация - на листе есть два столбца, в одном из них формула &quot;ИНДЕКС...ПОИСКПОЗ&quot;, которая...

Передача фокуса определенной ячейке
Какой код написать в кнопке чтобы перемещаться в определенную ячейку определенного листа? Вот так...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru