Создание собственного элемента на примере таблицы на C# для Windows Form
В данной статье я опишу создания своих элементов для C# Windows Form.
Для примера буду создавать таблицу со всем функционалом DataGridView. Позже перейдем на свои элементы. Создание первого элемента разобьем на несколько уроков. В данном уроке произведем от рисовку таблицы, а также: создание столбцов, строк, ячеек.
Для написания будем использовать .Net FrameWork 4.7.x, среда разработки Visual Studio 2019.
В первую очередь создадим обычный проект Windows Form. Думаю не нужно это показывать. А уже потом создаем проект «Библиотека элементов управления Windows Form»(Назовем его CustomControl).
Далее у нас будет создан файл UserControl.cs. Удаляем его и создаем обычный класс TableCustoms.cs.Наш класс будет наследоваться от класса Control.
Далее в этом же файле создадим еще несколько классов, а именно:Column,Row,Cell. Рассмотрим каждый по отдельности. Начнем с Column:
Класс Cell(Для поддержки копирования добавляем интерфейс ICloneable):
Теперь настроим наш основной класс TableCustoms:
Для того, чтобы у нас были полосы прокрутки нужно использовать ScrollableControl, поэтому создадим класс PanelTable наследуем ScrollableControl и помещаем его на Control(в следующем уроке объясню почему создаем два разных контрола, а не используем сразу ScrollableControl):
После этого «Пересобираем проект» элемента и добавляем элемент на форму(в основном проекте):
Как сделать таблицу в c
БлогNot. Visual C++: табличные компоненты и работа с ними
Visual C++: табличные компоненты и работа с ними
В этой статье мы рассмотрим на простых примерах основные приёмы работы с табличными компонентами .NET, среда для выполнения кода — Visual C++ (Studio) Express 2010 или выше.
Пример 1. Пишем приложение TableEditor1 для редактирования таблицы и сохранения её в формате XML.
На форму добавим компоненту dataGridView1 , а объекты DataTable и DataSet создадим программно.
Для этого опишем глобально в классе формы следующие величины:
На загрузку формы реализуем такой код (обработчик события Load ):
Перед закрытием формы выполним следующий код (обработчик события FormClosing ):
Данные сохраняются в формате XML.
DataSet представляет собой кэш данных, расположенный в оперативной памяти. DataSet состоит из коллекции объектов класса DataTable .
Доступ к ячейкам таблицы можно получить, используя свойства класса DataTable ( Rows , Cols , Item ) — но запись поля таблицы в файл может быть некорректной из-за того, что технология ADO.NET предусматривает кэширование данных.
Пример такого кода:
Поэтому следует пользоваться методами объекта DataSet .
Пример 2. Пишем проект TableEditor2 для связанных таблиц.
Компонента DataGrid — решение для показа связанных таблиц в одной компоненте, в DataGridView такой возможности нет. Не все компоненты доступны по умолчанию, в том числе, и DataGrid . Щёлкаем правой кнопкой мыши на панели элементов управления, Выбрать элементы, на вкладке «Компоненты .NET Framework» устанавливаем флажок возле элемента DataGrid пространства имен System.Windows.Forms , нажимаем ОК.
После этого DataGrid можно добавить на форму.
На загрузку формы (обработчик события Load ):
На нажатие кнопки (переключает между родительской и дочерней таблицами):
Пример 3. Делаем всё по-современному — через DataGridView . Подробнее об этом компоненте.
Он представляет собой прямоугольный массив ячеек, который можно рассматривать как коллекцию строк или столбцов.
Rows — коллекция строк, имеет тип DataGridRowCollection
Columns — коллекция столбцов, тип DataGridColumnCollection
Оба свойства индексируются как массивы для доступа к конкретной строке/столбцу, нумерация с нуля.
Cells — коллекция ячеек из объекта DataGridRowCollection , приведём пример доступа к ячейке:
RowCount , ColumnCount — количество строк и столбцов
В несвязанном режиме компонент может отображать любые табличные данные.
Методы для добавления/удаления/редактирования строк относятся к коллекции Rows и имеют типовые имена: Add , Insert , Clear , AddCopy , InsertCopy , Remove , RemoveAt и могут иметь по несколько перегрузок каждая, например, для Add есть версии Add() , Add(КоличествоНовыхСтрок) , Add (DataGridViewRow ^row) , Add (. Object ^object)
Настройка внешнего вида компонента также типовая: такие свойства, как BackColor , Alignment , Font и т.д. находятся в объекте типа DataGridViewCellStyle
Каждая ячейка представлена объектом System::Windows::Forms::DataViewCell , за «личный» внешний вид ячейки отвечает свойство InheritedStyle , вид по умолчанию — DefaultCellStyle
1. По нажатию кнопки перекрасим фон таблицы в розовый цвет:
2. . или только фон выбранной ячейки:
Значения cell_y , cell_x описаны глобально в классе формы:
инициализируются в обработчике её события Load :
и получаются значения в обработчиках событий dataGridView1_KeyUp , dataGridView1_MouseUp (одинаковым кодом):
3. Обработчик события dataGridView1_CellFormatting для выделения текущей ячейки жёлтым фоном:
4. Сделаем в dataGridView1 таблицу со значениями функции. Код по нажатию кнопки:
5. Есть также множество событий, связанных с редактированием ячейки: CellBeginEdit , CellEndEdit , CellParsing , CellValidating , CellValidated и т.д.
Например, по умолчанию наша таблица редактируется. Чтобы разрешить в первом столбце ( Y(X) ) ввод только числовых значений, напишем следующий код, выполняемый по событию CellValueChanged :
Величина lastValue описана в классе формы:
и, по событию CellBeginEdit , сохраняет предыдущее значение, хранимое в ячейке:
Красивое оформление таблицы в консоли С++
Всем привет. Хотелось бы узнать как делать вот такую красивую таблицу в консоли : 
Интересует как делать такой отступ в каждой строке, штатными средствами ? Нету никаких сдвигов, все ровнехонько. Искал, не нашел инфы такой. Заранее благодарю.
Скорее всего используется два приема: Дополнение строки лидирующими пробелами делается через что-то типа printf («% 4d», 1); Выравнивание в столбцы — через печать табуляции: printf («1\t2\n123\t2\n»);
Используйте манипуляторы вывода такие, как, например, std::setw , std::left , std::right и другие.
Для их использования включите заголовок <iomanip>
Вот, например, как можно вывести заголовок
В результате запуска вы получите вывод
Попробуйте библиотеку BPrinter (основана на Boost.Spirit, но может быть собрана и без нее). Правда она рисует границы таблицы.
![]()
надо знать максимальную ширину поля до начала вывода строк.
если ширина уже известна, то всё просто. например, функцией printf() :
собираем и проверяем:
справку по функции printf() (если установлена) можно посмотреть локально командой:
адаптировано из этого ответа.
![]()
![]()
самый универсальный вариант: нам нужны будут: структура в которой ты хранишь данные каждого обьекта . так же переменная структура size в которую мы будем записывать длину самого длинного поля примерно по такой логике: на старте все значения полей 0 . посредством пересчета длинны значения данных с strlen (если это не string то надо привести значение в тип string через itoa или др). ты добавляешь в список все свои обьекты и считаешь какой длины каждое поле. если длина поля больше чем то что в структуре size соответственного поля то перезаписываешь на новое значение. в конце ты будешь иметь максимальное значение каждого из полей для вывода. остается лишь запустить цикл в котором ты поставишь size — strlen(переменная на вывод) + n (где n это отступы между столбцами) пробелов а после и сам текст переменной на вывод. аналогично делается если отступ надо сделать сзади или разместить текст по середине.
Всё ещё ищете ответ? Посмотрите другие вопросы с метками c++ консоль оформление или задайте свой вопрос.
Site design / logo © 2022 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2022.6.10.42345
Нажимая «Принять все файлы cookie», вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.