From 098e5a1d3c2d518f0f17838f210a5dfc23c5e4af Mon Sep 17 00:00:00 2001 From: bekodeg Date: Fri, 25 Oct 2024 22:29:47 +0400 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=202=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD=D0=B5=D0=BD=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .editorconfig | 304 ++++++++++++++++++ .../CustomPdfTableWithGrouping.Designer.cs | 36 +++ .../Components/CustomPdfTableWithGrouping.cs | 73 +++++ .../Cop.Borovkov.Var3/Models/ColumnInfo.cs | 9 + .../Models/PdfTableWithGroupingInfo.cs | 33 ++ .../Cop.Borovkov.Var3/Models/RowInfo.cs | 19 ++ .../Models/TableModels/PdfTable.cs | 7 +- .../PIHelperSh.PdfCreater/PdfCreator.cs | 8 +- .../Forms/Form2.Designer.cs | 25 +- .../TestCustomComponents/Forms/Form2.cs | 77 ++++- .../TestCustomComponents/Forms/Form2.resx | 7 +- .../TestCustomComponents/Models/TestModel.cs | 2 + 12 files changed, 588 insertions(+), 12 deletions(-) create mode 100644 .editorconfig create mode 100644 Cop.Borovkov.Var3/Cop.Borovkov.Var3/Components/CustomPdfTableWithGrouping.Designer.cs create mode 100644 Cop.Borovkov.Var3/Cop.Borovkov.Var3/Components/CustomPdfTableWithGrouping.cs create mode 100644 Cop.Borovkov.Var3/Cop.Borovkov.Var3/Models/ColumnInfo.cs create mode 100644 Cop.Borovkov.Var3/Cop.Borovkov.Var3/Models/PdfTableWithGroupingInfo.cs create mode 100644 Cop.Borovkov.Var3/Cop.Borovkov.Var3/Models/RowInfo.cs diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..5140c11 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,304 @@ +# Удалите строку ниже, если вы хотите наследовать параметры .editorconfig из каталогов, расположенных выше в иерархии +root = true + +# Файлы C# +[*.cs] + +#### Основные параметры EditorConfig #### + +# Отступы и интервалы +indent_size = 4 +indent_style = space +tab_width = 4 + +# Предпочтения для новых строк +end_of_line = crlf +insert_final_newline = false + +#### Рекомендации по написанию кода .NET #### + +# Упорядочение Using +dotnet_separate_import_directive_groups = false +dotnet_sort_system_directives_first = false +file_header_template = unset + +# Предпочтения для this. и Me. +dotnet_style_qualification_for_event = false:suggestion +dotnet_style_qualification_for_field = false +dotnet_style_qualification_for_method = false:suggestion +dotnet_style_qualification_for_property = false:suggestion + +# Параметры использования ключевых слов языка и типов BCL +dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion +dotnet_style_predefined_type_for_member_access = true:suggestion + +# Предпочтения для скобок +dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:suggestion +dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:suggestion +dotnet_style_parentheses_in_other_operators = never_if_unnecessary:suggestion +dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:suggestion + +# Предпочтения модификатора +dotnet_style_require_accessibility_modifiers = for_non_interface_members + +# Выражения уровень предпочтения +dotnet_style_coalesce_expression = true +dotnet_style_collection_initializer = true:warning +dotnet_style_explicit_tuple_names = true:warning +dotnet_style_namespace_match_folder = true +dotnet_style_null_propagation = true +dotnet_style_object_initializer = true:warning +dotnet_style_operator_placement_when_wrapping = beginning_of_line +dotnet_style_prefer_auto_properties = true:warning +dotnet_style_prefer_collection_expression = when_types_loosely_match +dotnet_style_prefer_compound_assignment = true:warning +dotnet_style_prefer_conditional_expression_over_assignment = true:suggestion +dotnet_style_prefer_conditional_expression_over_return = true:suggestion +dotnet_style_prefer_foreach_explicit_cast_in_source = when_strongly_typed +dotnet_style_prefer_inferred_anonymous_type_member_names = true:warning +dotnet_style_prefer_inferred_tuple_names = true:warning +dotnet_style_prefer_is_null_check_over_reference_equality_method = true +dotnet_style_prefer_simplified_boolean_expressions = true:warning +dotnet_style_prefer_simplified_interpolation = true + +# Предпочтения для полей +dotnet_style_readonly_field = true + +# Настройки параметров +dotnet_code_quality_unused_parameters = all + +# Параметры подавления +dotnet_remove_unnecessary_suppression_exclusions = none + +# Предпочтения для новых строк +dotnet_style_allow_multiple_blank_lines_experimental = false:warning +dotnet_style_allow_statement_immediately_after_block_experimental = false:suggestion + +#### Рекомендации по написанию кода C# #### + +# Предпочтения var +csharp_style_var_elsewhere = false:suggestion +csharp_style_var_for_built_in_types = false:suggestion +csharp_style_var_when_type_is_apparent = true:suggestion + +# Члены, заданные выражениями +csharp_style_expression_bodied_accessors = true:warning +csharp_style_expression_bodied_constructors = false:suggestion +csharp_style_expression_bodied_indexers = true:warning +csharp_style_expression_bodied_lambdas = true:warning +csharp_style_expression_bodied_local_functions = false +csharp_style_expression_bodied_methods = true:suggestion +csharp_style_expression_bodied_operators = true:suggestion +csharp_style_expression_bodied_properties = true:warning + +# Настройки соответствия шаблонов +csharp_style_pattern_matching_over_as_with_null_check = true +csharp_style_pattern_matching_over_is_with_cast_check = true +csharp_style_prefer_extended_property_pattern = true +csharp_style_prefer_not_pattern = true +csharp_style_prefer_pattern_matching = true:suggestion +csharp_style_prefer_switch_expression = true:warning + +# Настройки проверки на null +csharp_style_conditional_delegate_call = true + +# Предпочтения модификатора +csharp_prefer_static_local_function = true +csharp_preferred_modifier_order = public,private,protected,internal,file,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,required,volatile,async +csharp_style_prefer_readonly_struct = true +csharp_style_prefer_readonly_struct_member = true + +# Предпочтения для блоков кода +csharp_prefer_braces = true:suggestion +csharp_prefer_simple_using_statement = true +csharp_style_namespace_declarations = block_scoped:warning +csharp_style_prefer_method_group_conversion = true:warning +csharp_style_prefer_primary_constructors = true +csharp_style_prefer_top_level_statements = true:warning + +# Выражения уровень предпочтения +csharp_prefer_simple_default_expression = true:warning +csharp_style_deconstructed_variable_declaration = true +csharp_style_implicit_object_creation_when_type_is_apparent = true:warning +csharp_style_inlined_variable_declaration = true +csharp_style_prefer_index_operator = true:warning +csharp_style_prefer_local_over_anonymous_function = true +csharp_style_prefer_null_check_over_type_check = true +csharp_style_prefer_range_operator = true:warning +csharp_style_prefer_tuple_swap = true:warning +csharp_style_prefer_utf8_string_literals = true +csharp_style_throw_expression = true +csharp_style_unused_value_assignment_preference = discard_variable:warning +csharp_style_unused_value_expression_statement_preference = discard_variable:suggestion + +# предпочтения для директивы using +csharp_using_directive_placement = outside_namespace:warning + +# Предпочтения для новых строк +csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = false:warning +csharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental = false:warning +csharp_style_allow_blank_line_after_token_in_conditional_expression_experimental = false:warning +csharp_style_allow_blank_lines_between_consecutive_braces_experimental = false:warning +csharp_style_allow_embedded_statements_on_same_line_experimental = true:warning + +#### Правила форматирования C# #### + +# Предпочтения для новых строк +csharp_new_line_before_catch = true +csharp_new_line_before_else = true +csharp_new_line_before_finally = true +csharp_new_line_before_members_in_anonymous_types = true +csharp_new_line_before_members_in_object_initializers = true +csharp_new_line_before_open_brace = all +csharp_new_line_between_query_expression_clauses = true + +# Предпочтения для отступов +csharp_indent_block_contents = true +csharp_indent_braces = false +csharp_indent_case_contents = true +csharp_indent_case_contents_when_block = true +csharp_indent_labels = one_less_than_current +csharp_indent_switch_labels = true + +# Предпочтения для интервалов +csharp_space_after_cast = false +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_after_comma = true +csharp_space_after_dot = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_after_semicolon_in_for_statement = true +csharp_space_around_binary_operators = before_and_after +csharp_space_around_declaration_statements = false +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_before_comma = false +csharp_space_before_dot = false +csharp_space_before_open_square_brackets = false +csharp_space_before_semicolon_in_for_statement = false +csharp_space_between_empty_square_brackets = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_declaration_name_and_open_parenthesis = false +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_parentheses = false +csharp_space_between_square_brackets = false + +# Предпочтения переноса +csharp_preserve_single_line_blocks = true +csharp_preserve_single_line_statements = true + +#### Стили именования #### + +# Правила именования + +dotnet_naming_rule.asyncmethods_should_be_pascalcaseasync.severity = warning +dotnet_naming_rule.asyncmethods_should_be_pascalcaseasync.symbols = asyncmethods +dotnet_naming_rule.asyncmethods_should_be_pascalcaseasync.style = pascalcaseasync + +dotnet_naming_rule.staticasyncmethods_should_be_pascalcaseasync.severity = warning +dotnet_naming_rule.staticasyncmethods_should_be_pascalcaseasync.symbols = staticasyncmethods +dotnet_naming_rule.staticasyncmethods_should_be_pascalcaseasync.style = pascalcaseasync + +dotnet_naming_rule.constmember_should_be_constant_case.severity = warning +dotnet_naming_rule.constmember_should_be_constant_case.symbols = constmember +dotnet_naming_rule.constmember_should_be_constant_case.style = constant_case + +dotnet_naming_rule.genericparametrs_should_be_typepascalcase.severity = warning +dotnet_naming_rule.genericparametrs_should_be_typepascalcase.symbols = genericparametrs +dotnet_naming_rule.genericparametrs_should_be_typepascalcase.style = typepascalcase + +dotnet_naming_rule.localmembers_should_be_camelcase.severity = warning +dotnet_naming_rule.localmembers_should_be_camelcase.symbols = localmembers +dotnet_naming_rule.localmembers_should_be_camelcase.style = camelcase + +dotnet_naming_rule.privatfealds_should_be__privatcamalcase.severity = warning +dotnet_naming_rule.privatfealds_should_be__privatcamalcase.symbols = privatfealds +dotnet_naming_rule.privatfealds_should_be__privatcamalcase.style = _privatcamalcase + +dotnet_naming_rule.interface_should_be_begins_with_i.severity = warning +dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface +dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i + +dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = warning +dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members +dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case + +dotnet_naming_rule.types_should_be_pascal_case.severity = warning +dotnet_naming_rule.types_should_be_pascal_case.symbols = types +dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case + +# Спецификации символов + +dotnet_naming_symbols.interface.applicable_kinds = interface +dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.interface.required_modifiers = + +dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum +dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.types.required_modifiers = + +dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method +dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.non_field_members.required_modifiers = + +dotnet_naming_symbols.asyncmethods.applicable_kinds = method +dotnet_naming_symbols.asyncmethods.applicable_accessibilities = * +dotnet_naming_symbols.asyncmethods.required_modifiers = async + +dotnet_naming_symbols.staticasyncmethods.applicable_kinds = method, local_function +dotnet_naming_symbols.staticasyncmethods.applicable_accessibilities = * +dotnet_naming_symbols.staticasyncmethods.required_modifiers = async, static + +dotnet_naming_symbols.constmember.applicable_kinds = property, field +dotnet_naming_symbols.constmember.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.constmember.required_modifiers = const + +dotnet_naming_symbols.localmembers.applicable_kinds = property, field, parameter, local, method +dotnet_naming_symbols.localmembers.applicable_accessibilities = local +dotnet_naming_symbols.localmembers.required_modifiers = + +dotnet_naming_symbols.privatfealds.applicable_kinds = property, field +dotnet_naming_symbols.privatfealds.applicable_accessibilities = private +dotnet_naming_symbols.privatfealds.required_modifiers = + +dotnet_naming_symbols.genericparametrs.applicable_kinds = type_parameter +dotnet_naming_symbols.genericparametrs.applicable_accessibilities = * +dotnet_naming_symbols.genericparametrs.required_modifiers = + +# Стили именования + +dotnet_naming_style.pascal_case.required_prefix = +dotnet_naming_style.pascal_case.required_suffix = +dotnet_naming_style.pascal_case.word_separator = +dotnet_naming_style.pascal_case.capitalization = pascal_case + +dotnet_naming_style.begins_with_i.required_prefix = I +dotnet_naming_style.begins_with_i.required_suffix = +dotnet_naming_style.begins_with_i.word_separator = +dotnet_naming_style.begins_with_i.capitalization = pascal_case + +dotnet_naming_style.camelcase.required_prefix = +dotnet_naming_style.camelcase.required_suffix = +dotnet_naming_style.camelcase.word_separator = +dotnet_naming_style.camelcase.capitalization = camel_case + +dotnet_naming_style.constant_case.required_prefix = +dotnet_naming_style.constant_case.required_suffix = +dotnet_naming_style.constant_case.word_separator = _ +dotnet_naming_style.constant_case.capitalization = all_upper + +dotnet_naming_style._privatcamalcase.required_prefix = _ +dotnet_naming_style._privatcamalcase.required_suffix = +dotnet_naming_style._privatcamalcase.word_separator = +dotnet_naming_style._privatcamalcase.capitalization = camel_case + +dotnet_naming_style.pascalcaseasync.required_prefix = +dotnet_naming_style.pascalcaseasync.required_suffix = Async +dotnet_naming_style.pascalcaseasync.word_separator = +dotnet_naming_style.pascalcaseasync.capitalization = pascal_case + +dotnet_naming_style.typepascalcase.required_prefix = T +dotnet_naming_style.typepascalcase.required_suffix = +dotnet_naming_style.typepascalcase.word_separator = +dotnet_naming_style.typepascalcase.capitalization = pascal_case diff --git a/Cop.Borovkov.Var3/Cop.Borovkov.Var3/Components/CustomPdfTableWithGrouping.Designer.cs b/Cop.Borovkov.Var3/Cop.Borovkov.Var3/Components/CustomPdfTableWithGrouping.Designer.cs new file mode 100644 index 0000000..8f614a5 --- /dev/null +++ b/Cop.Borovkov.Var3/Cop.Borovkov.Var3/Components/CustomPdfTableWithGrouping.Designer.cs @@ -0,0 +1,36 @@ +namespace Cop.Borovkov.Var3.Components +{ + partial class CustomPdfTableWithGrouping + { + /// + /// Обязательная переменная конструктора. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Освободить все используемые ресурсы. + /// + /// истинно, если управляемый ресурс должен быть удален; иначе ложно. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Код, автоматически созданный конструктором компонентов + + /// + /// Требуемый метод для поддержки конструктора — не изменяйте + /// содержимое этого метода с помощью редактора кода. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/Cop.Borovkov.Var3/Cop.Borovkov.Var3/Components/CustomPdfTableWithGrouping.cs b/Cop.Borovkov.Var3/Cop.Borovkov.Var3/Components/CustomPdfTableWithGrouping.cs new file mode 100644 index 0000000..e187fbc --- /dev/null +++ b/Cop.Borovkov.Var3/Cop.Borovkov.Var3/Components/CustomPdfTableWithGrouping.cs @@ -0,0 +1,73 @@ +using Cop.Borovkov.Var3.Models; +using PIHelperSh.PdfCreator.Models.TableModels; +using PIHelperSh.PdfCreator; +using System.ComponentModel; +using PIHelperSh.PdfCreator.Enums; +using PIHelperSh.PdfCreator.Interfaces; + +namespace Cop.Borovkov.Var3.Components +{ + /// + /// Компонент создающий таблицу и группирует элементы по 1 столбцу + /// + public partial class CustomPdfTableWithGrouping : Component + { + /// + /// + public CustomPdfTableWithGrouping() + { + InitializeComponent(); + } + + /// + /// + /// + public CustomPdfTableWithGrouping(IContainer container) + { + container.Add(this); + InitializeComponent(); + } + + /// + /// Сохранить набор таблиц в пдф + /// + /// + /// + /// + public void SaveToPdf(PdfTableWithGroupingInfo tableInfo) where TType : class + { + if (!tableInfo.Columns.Any() || !tableInfo.Rows.Any()) + { + return; + } + + PdfCreator creator = new PdfCreator(); + + creator.AddParagraph(new() + { + Style = PdfStyleType.Title, + Text = tableInfo.Title, + MarginAfter = PdfMargin.Smal, + }); + + creator.AddTable(new PdfTable() + { + Header = tableInfo.Columns.Select(c => new PdfTableColumn() + { + Title = c.Header, + Size = c.Width, + PropertyName = c.PropertyName, + } as IPdfColumnItem).ToList(), + + Records = tableInfo.Rows + .OrderBy(r => typeof(TType) + .GetProperty(tableInfo.Columns.First().PropertyName)!.GetValue(r.Value)) + .Select(r => (r.Value, r.Height)) + .ToList(), + HeaderHeaight = tableInfo.HeaderHeight, + }); + + creator.SavePdf(tableInfo.FilePath); + } + } +} diff --git a/Cop.Borovkov.Var3/Cop.Borovkov.Var3/Models/ColumnInfo.cs b/Cop.Borovkov.Var3/Cop.Borovkov.Var3/Models/ColumnInfo.cs new file mode 100644 index 0000000..ea874e1 --- /dev/null +++ b/Cop.Borovkov.Var3/Cop.Borovkov.Var3/Models/ColumnInfo.cs @@ -0,0 +1,9 @@ +namespace Cop.Borovkov.Var3.Models +{ + public record ColumnInfo + { + public string Header { get; init; } = null!; + public string PropertyName { get; init; } = null!; + public float Width { get; init; } = 3; + } +} diff --git a/Cop.Borovkov.Var3/Cop.Borovkov.Var3/Models/PdfTableWithGroupingInfo.cs b/Cop.Borovkov.Var3/Cop.Borovkov.Var3/Models/PdfTableWithGroupingInfo.cs new file mode 100644 index 0000000..f920b4e --- /dev/null +++ b/Cop.Borovkov.Var3/Cop.Borovkov.Var3/Models/PdfTableWithGroupingInfo.cs @@ -0,0 +1,33 @@ +namespace Cop.Borovkov.Var3.Models +{ + /// + /// Параметры для создания таблици в пдф с группировкой по 1 столбцу + /// + public class PdfTableWithGroupingInfo where TType : class + { + /// + /// имя файла (включая путь до файла) + /// + public string FilePath { get; init; } = @"C:\pdfTable.pdf"; + + /// + /// название документа(заголовок в документе) + /// + public string Title { get; init; } = "Таблица"; + + /// + /// Высота заголовков + /// + public float HeaderHeight { get; init; } = 0.5f; + + /// + /// Параметры столбцов + /// + public IEnumerable Columns { get; init; } = []; + + /// + /// Список таблиц + /// + public IEnumerable> Rows { get; init; } = []; + } +} diff --git a/Cop.Borovkov.Var3/Cop.Borovkov.Var3/Models/RowInfo.cs b/Cop.Borovkov.Var3/Cop.Borovkov.Var3/Models/RowInfo.cs new file mode 100644 index 0000000..1693002 --- /dev/null +++ b/Cop.Borovkov.Var3/Cop.Borovkov.Var3/Models/RowInfo.cs @@ -0,0 +1,19 @@ +namespace Cop.Borovkov.Var3.Models +{ + /// + /// Информация о строке + /// + /// + public record RowInfo where T : class + { + /// + /// Высота строки + /// + public float Height { get; set; } = 0.5f; + + /// + /// Значение строки + /// + public T Value { get; set; } = null!; + } +} diff --git a/Cop.Borovkov.Var3/PIHelperSh.PdfCreater/Models/TableModels/PdfTable.cs b/Cop.Borovkov.Var3/PIHelperSh.PdfCreater/Models/TableModels/PdfTable.cs index 81b483b..8941931 100644 --- a/Cop.Borovkov.Var3/PIHelperSh.PdfCreater/Models/TableModels/PdfTable.cs +++ b/Cop.Borovkov.Var3/PIHelperSh.PdfCreater/Models/TableModels/PdfTable.cs @@ -27,7 +27,7 @@ namespace PIHelperSh.PdfCreator.Models.TableModels /// /// Список объектов, информация о которых будет в таблице. /// - public List Records { get; set; } = new(); + public List<(T value, float height)> Records { get; set; } = new(); /// /// Стиль объектов в таблице (по умолчанию - базовый) @@ -38,5 +38,10 @@ namespace PIHelperSh.PdfCreator.Models.TableModels /// Выравнивание текста объектов в таблице (по умолчанию - по левой строне) /// public PdfAlignmentType RecordHorizontalAlignment { get; set; } = PdfAlignmentType.Left; + + /// + /// Высота заголовка + /// + public float HeaderHeaight { get; set; } } } diff --git a/Cop.Borovkov.Var3/PIHelperSh.PdfCreater/PdfCreator.cs b/Cop.Borovkov.Var3/PIHelperSh.PdfCreater/PdfCreator.cs index ca7eb08..ea5110e 100644 --- a/Cop.Borovkov.Var3/PIHelperSh.PdfCreater/PdfCreator.cs +++ b/Cop.Borovkov.Var3/PIHelperSh.PdfCreater/PdfCreator.cs @@ -253,6 +253,9 @@ namespace PIHelperSh.PdfCreator } } + upRow.Height = header.HeaderHeaight; + downRow.Height = header.HeaderHeaight; + return objectFields; } @@ -428,9 +431,12 @@ namespace PIHelperSh.PdfCreator foreach (var item in header.Records) { var row = table.AddRow(); + + row.Height = item.height; + for (int i = 0; i < maper.Count; i++) { - ConfigurateCell(row.Cells[i], maper[i](item)?.ToString()!, header.RecordHorizontalAlignment, header.RecordStyle); + ConfigurateCell(row.Cells[i], maper[i](item.value)?.ToString()!, header.RecordHorizontalAlignment, header.RecordStyle); } } } diff --git a/Cop.Borovkov.Var3/TestCustomComponents/Forms/Form2.Designer.cs b/Cop.Borovkov.Var3/TestCustomComponents/Forms/Form2.Designer.cs index 28464d4..c080162 100644 --- a/Cop.Borovkov.Var3/TestCustomComponents/Forms/Form2.Designer.cs +++ b/Cop.Borovkov.Var3/TestCustomComponents/Forms/Form2.Designer.cs @@ -31,24 +31,39 @@ components = new System.ComponentModel.Container(); customPdfTable1 = new Cop.Borovkov.Var3.Components.CustomPdfTable(components); button1 = new Button(); + button2 = new Button(); + customPdfTableWithGrouping1 = new Cop.Borovkov.Var3.Components.CustomPdfTableWithGrouping(components); SuspendLayout(); // // button1 // - button1.Location = new Point(12, 12); + button1.Location = new Point(14, 16); + button1.Margin = new Padding(3, 4, 3, 4); button1.Name = "button1"; - button1.Size = new Size(75, 23); + button1.Size = new Size(86, 31); button1.TabIndex = 0; button1.Text = "button1"; button1.UseVisualStyleBackColor = true; button1.Click += button1_Click; // + // button2 + // + button2.Location = new Point(106, 16); + button2.Name = "button2"; + button2.Size = new Size(94, 29); + button2.TabIndex = 1; + button2.Text = "button2"; + button2.UseVisualStyleBackColor = true; + button2.Click += button2_Click; + // // Form2 // - AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleDimensions = new SizeF(8F, 20F); AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(800, 450); + ClientSize = new Size(914, 600); + Controls.Add(button2); Controls.Add(button1); + Margin = new Padding(3, 4, 3, 4); Name = "Form2"; Text = "Form2"; ResumeLayout(false); @@ -58,5 +73,7 @@ private Cop.Borovkov.Var3.Components.CustomPdfTable customPdfTable1; private Button button1; + private Button button2; + private Cop.Borovkov.Var3.Components.CustomPdfTableWithGrouping customPdfTableWithGrouping1; } } \ No newline at end of file diff --git a/Cop.Borovkov.Var3/TestCustomComponents/Forms/Form2.cs b/Cop.Borovkov.Var3/TestCustomComponents/Forms/Form2.cs index 9787dc0..0b6b9a4 100644 --- a/Cop.Borovkov.Var3/TestCustomComponents/Forms/Form2.cs +++ b/Cop.Borovkov.Var3/TestCustomComponents/Forms/Form2.cs @@ -1,4 +1,7 @@ -namespace TestCustomComponents.Forms +using Newtonsoft.Json.Serialization; +using TestCustomComponents.Models; + +namespace TestCustomComponents.Forms { public partial class Form2 : Form { @@ -11,9 +14,9 @@ { customPdfTable1.SaveToPdf(new() { - FilePath = @"F:\test\test.pdf", + FilePath = @"E:\test\test.pdf", Title = "Текст заголовка", - Tables = [new[,] + Tables = [new[,] { { "00", "01", "02" }, { "10", "11", "12" }, @@ -23,7 +26,7 @@ customPdfTable1.SaveToPdf(new() { - FilePath = @"F:\test\test.pdf", + FilePath = @"E:\test\test.pdf", Title = "Текст заголовка", Tables = [new[,] { @@ -38,5 +41,71 @@ }], }); } + + private void button2_Click(object sender, EventArgs e) + { + customPdfTableWithGrouping1.SaveToPdf(new() + { + FilePath = @"E:\test\test.pdf", + Title = "Текст заголовка", + Columns = [ + new() { + Header = "1", + PropertyName = nameof(TestModel.Height), + }, + new() { + Header = "2", + PropertyName = nameof(TestModel.Name), + }, + new() { + Header = "3", + PropertyName = nameof(TestModel.Id), + }, + new() { + Header = "4", + PropertyName = nameof(TestModel.Age), + } + ], + Rows = [ + new() { + Value = new TestModel() { + Id = 1, + Name = "Vasya", + Age = 5, + Height = "low", + }, + Height = 100f, + }, + new() { + Value = new TestModel() { + Id = 2, + Name = "Masya", + Age = 8, + Height = "hi", + }, + Height = 100f, + }, + new() { + Value = new TestModel() { + Id = 3, + Name = "Kasya", + Age = 3, + Height = "low", + }, + Height = 10f, + }, + new() { + Value = new TestModel() { + Id = 4, + Name = "Asya", + Age = 100, + Height = "hi", + }, + Height = 50f, + }, + ], + HeaderHeight = 100f, + }); + } } } diff --git a/Cop.Borovkov.Var3/TestCustomComponents/Forms/Form2.resx b/Cop.Borovkov.Var3/TestCustomComponents/Forms/Form2.resx index b5ff85f..f501082 100644 --- a/Cop.Borovkov.Var3/TestCustomComponents/Forms/Form2.resx +++ b/Cop.Borovkov.Var3/TestCustomComponents/Forms/Form2.resx @@ -1,7 +1,7 @@