diff --git a/TestsComponents/FormTestComponents.Designer.cs b/TestsComponents/FormTestComponents.Designer.cs index 1a00ed9..1174020 100644 --- a/TestsComponents/FormTestComponents.Designer.cs +++ b/TestsComponents/FormTestComponents.Designer.cs @@ -20,77 +20,143 @@ base.Dispose(disposing); } - #region Windows Form Designer generated code + #region Windows Form Designer generated code - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - userCheckedListBox = new WinFormsLibrary1.UserCheckedListBox(); - buttonClear = new Button(); - ButtonShowItems = new Button(); - textBoxItems = new TextBox(); - SuspendLayout(); - // - // userCheckedListBox - // - userCheckedListBox.Location = new Point(0, 0); - userCheckedListBox.Name = "userCheckedListBox"; - userCheckedListBox.SelectedValue = ""; - userCheckedListBox.Size = new Size(263, 170); - userCheckedListBox.TabIndex = 0; - userCheckedListBox.SelectedValueChanged += UserCheckedListBox_SelectedValueChanged; - // - // buttonClear - // - buttonClear.Location = new Point(0, 176); - buttonClear.Name = "buttonClear"; - buttonClear.Size = new Size(263, 29); - buttonClear.TabIndex = 2; - buttonClear.Text = "Очистить"; - buttonClear.UseVisualStyleBackColor = true; - buttonClear.Click += buttonClear_Click; - // - // ButtonShowItems - // - ButtonShowItems.Location = new Point(0, 211); - ButtonShowItems.Name = "ButtonShowItems"; - ButtonShowItems.Size = new Size(263, 29); - ButtonShowItems.TabIndex = 3; - ButtonShowItems.Text = "Показать"; - ButtonShowItems.UseVisualStyleBackColor = true; - ButtonShowItems.Click += ButtonShowItems_Click; - // - // textBoxItems - // - textBoxItems.Location = new Point(0, 246); - textBoxItems.Multiline = true; - textBoxItems.Name = "textBoxItems"; - textBoxItems.Size = new Size(263, 87); - textBoxItems.TabIndex = 4; - // - // FormTestComponents - // - AutoScaleDimensions = new SizeF(8F, 20F); - AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(800, 450); - Controls.Add(textBoxItems); - Controls.Add(ButtonShowItems); - Controls.Add(buttonClear); - Controls.Add(userCheckedListBox); - Name = "FormTestComponents"; - Text = "FormTestComponents "; - ResumeLayout(false); - PerformLayout(); - } + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + userCheckedListBox = new WinFormsLibrary1.UserCheckedListBox(); + buttonClear = new Button(); + ButtonShowItems = new Button(); + textBoxItems = new TextBox(); + userDateTimePicker = new COP.UserDateTimePicker(); + textBoxShowDate = new TextBox(); + ButtonShowDate = new Button(); + ButtonRangeSet = new Button(); + userTreeView = new COP.UserTreeView(); + SuspendLayout(); + // + // userCheckedListBox + // + userCheckedListBox.Location = new Point(0, 0); + userCheckedListBox.Margin = new Padding(3, 2, 3, 2); + userCheckedListBox.Name = "userCheckedListBox"; + userCheckedListBox.SelectedValue = ""; + userCheckedListBox.Size = new Size(230, 128); + userCheckedListBox.TabIndex = 0; + userCheckedListBox.SelectedValueChanged += UserCheckedListBox_SelectedValueChanged; + // + // buttonClear + // + buttonClear.Location = new Point(0, 132); + buttonClear.Margin = new Padding(3, 2, 3, 2); + buttonClear.Name = "buttonClear"; + buttonClear.Size = new Size(230, 22); + buttonClear.TabIndex = 2; + buttonClear.Text = "Очистить"; + buttonClear.UseVisualStyleBackColor = true; + buttonClear.Click += buttonClear_Click; + // + // ButtonShowItems + // + ButtonShowItems.Location = new Point(0, 158); + ButtonShowItems.Margin = new Padding(3, 2, 3, 2); + ButtonShowItems.Name = "ButtonShowItems"; + ButtonShowItems.Size = new Size(230, 22); + ButtonShowItems.TabIndex = 3; + ButtonShowItems.Text = "Показать"; + ButtonShowItems.UseVisualStyleBackColor = true; + ButtonShowItems.Click += ButtonShowItems_Click; + // + // textBoxItems + // + textBoxItems.Location = new Point(0, 184); + textBoxItems.Margin = new Padding(3, 2, 3, 2); + textBoxItems.Multiline = true; + textBoxItems.Name = "textBoxItems"; + textBoxItems.Size = new Size(231, 66); + textBoxItems.TabIndex = 4; + // + // userDateTimePicker + // + userDateTimePicker.Location = new Point(258, 11); + userDateTimePicker.Margin = new Padding(3, 2, 3, 2); + userDateTimePicker.MaxValue = null; + userDateTimePicker.MinValue = null; + userDateTimePicker.Name = "userDateTimePicker"; + userDateTimePicker.Size = new Size(222, 22); + userDateTimePicker.TabIndex = 5; + userDateTimePicker.ValueChanged += UserDateTimePicker_ValueChanged; + // + // textBoxShowDate + // + textBoxShowDate.Location = new Point(258, 58); + textBoxShowDate.Name = "textBoxShowDate"; + textBoxShowDate.Size = new Size(222, 23); + textBoxShowDate.TabIndex = 6; + // + // ButtonShowDate + // + ButtonShowDate.Location = new Point(290, 105); + ButtonShowDate.Name = "ButtonShowDate"; + ButtonShowDate.Size = new Size(168, 23); + ButtonShowDate.TabIndex = 7; + ButtonShowDate.Text = "Показать"; + ButtonShowDate.UseVisualStyleBackColor = true; + ButtonShowDate.Click += ButtonShowDate_Click; + // + // ButtonRangeSet + // + ButtonRangeSet.Location = new Point(486, 47); + ButtonRangeSet.Name = "ButtonRangeSet"; + ButtonRangeSet.Size = new Size(131, 43); + ButtonRangeSet.TabIndex = 8; + ButtonRangeSet.Text = "Установить диапозон"; + ButtonRangeSet.UseVisualStyleBackColor = true; + ButtonRangeSet.Click += ButtonRangeSet_Click; + // + // userTreeView + // + userTreeView.Location = new Point(454, 158); + userTreeView.Name = "userTreeView"; + userTreeView.Size = new Size(150, 95); + userTreeView.TabIndex = 9; + userTreeView.Load += UserTreeView_Load; + // + // FormTestComponents + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(700, 338); + Controls.Add(userTreeView); + Controls.Add(ButtonRangeSet); + Controls.Add(ButtonShowDate); + Controls.Add(textBoxShowDate); + Controls.Add(userDateTimePicker); + Controls.Add(textBoxItems); + Controls.Add(ButtonShowItems); + Controls.Add(buttonClear); + Controls.Add(userCheckedListBox); + Margin = new Padding(3, 2, 3, 2); + Name = "FormTestComponents"; + Text = "FormTestComponents "; + ResumeLayout(false); + PerformLayout(); + } - #endregion + #endregion - private WinFormsLibrary1.UserCheckedListBox userCheckedListBox; + private WinFormsLibrary1.UserCheckedListBox userCheckedListBox; private Button buttonClear; private Button ButtonShowItems; private TextBox textBoxItems; - } + private COP.UserDateTimePicker userDateTimePicker; + private TextBox textBoxShowDate; + private Button ButtonShowDate; + private Button ButtonRangeSet; + private COP.UserTreeView userTreeView; + } } diff --git a/TestsComponents/FormTestComponents.cs b/TestsComponents/FormTestComponents.cs index c370512..c9057ff 100644 --- a/TestsComponents/FormTestComponents.cs +++ b/TestsComponents/FormTestComponents.cs @@ -1,29 +1,85 @@ +using COP; + namespace TestsComponents { - public partial class FormTestComponents : Form - { - public FormTestComponents() - { - InitializeComponent(); - Fill(); - } - public void Fill() - { - userCheckedListBox.append(new() { "items1", "dsdsf", "items3", "fgdg", "iit" }); - } - private void UserCheckedListBox_SelectedValueChanged(object sender, EventArgs e) - { - MessageBox.Show("Selected value changed"); - } - private void buttonClear_Click(object sender, EventArgs e) - { - userCheckedListBox.ClearList(); - } - private void ButtonShowItems_Click(object sender, EventArgs e) - { - - textBoxItems.Text = userCheckedListBox.SelectedValue; - } - - } + public partial class FormTestComponents : Form + { + public FormTestComponents() + { + InitializeComponent(); + Fill(); + } + public void Fill() + { + userCheckedListBox.append(new() { "items1", "dsdsf", "items3", "fgdg", "iit" }); + } + private void UserCheckedListBox_SelectedValueChanged(object sender, EventArgs e) + { + + MessageBox.Show("Selected value changed"); + + } + private void buttonClear_Click(object sender, EventArgs e) + { + userCheckedListBox.ClearList(); + } + private void ButtonShowItems_Click(object sender, EventArgs e) + { + + textBoxItems.Text = userCheckedListBox.SelectedValue; + } + private void ButtonShowDate_Click(object sender, EventArgs e) + { + try + { + textBoxShowDate.Clear(); + textBoxShowDate.Text = userDateTimePicker.SelectedValue.ToString(); + } + catch (Exception ex) + { + MessageBox.Show(""); + } + } + private void UserDateTimePicker_ValueChanged(object sender, EventArgs e) + { + MessageBox.Show("Value changed"); + DateTime? selectedDate = userDateTimePicker.SelectedValue; + } + + private void ButtonRangeSet_Click(object sender, EventArgs e) + { + userDateTimePicker.MaxValue = new DateTime(2024, 9, 20); + userDateTimePicker.MinValue = new DateTime(2024,8,10); + } + private void UserTreeView_Load(object sender, EventArgs e) + { + List employees = new List + { + new Employee { Department = "1", Position = "1", Name = "1" }, + new Employee { Department = "2", Position = "2", Name = "2" }, + new Employee { Department = "1", Position = "1", Name = "3" }, + new Employee { Department = "2", Position = "3", Name = "4" }, + }; + var Hierarchy = new List { "Department", "Position", "Name" }; + foreach (var prop in employees[0].GetType().GetProperties()) + { + userTreeView.Hierarchy.Add(prop.Name); + } + + try + { + userTreeView.PopulateTree(employees); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + } + } + public class Employee + { + public string? Department { get; set; } + public string? Position { get; set; } + public string? Name { get; set; } + } + } } diff --git a/WinFormsLibrary1/Exceptions/NoRangeException.cs b/WinFormsLibrary1/Exceptions/NoRangeException.cs index f1958ef..6e4a6b8 100644 --- a/WinFormsLibrary1/Exceptions/NoRangeException.cs +++ b/WinFormsLibrary1/Exceptions/NoRangeException.cs @@ -8,7 +8,7 @@ using System.Threading.Tasks; namespace COP.Exceptions { [Serializable] - public class NoRangeException : ApplicationException + public class NoRangeException : Exception { public NoRangeException() : base() { } public NoRangeException(string message) : base(message) { } diff --git a/WinFormsLibrary1/Exceptions/NotIncludedInRangeException.cs b/WinFormsLibrary1/Exceptions/NotIncludedInRangeException.cs index 612f586..0ea0609 100644 --- a/WinFormsLibrary1/Exceptions/NotIncludedInRangeException.cs +++ b/WinFormsLibrary1/Exceptions/NotIncludedInRangeException.cs @@ -8,7 +8,7 @@ using System.Threading.Tasks; namespace COP.Exceptions { [Serializable] - public class NotIncludedInRangeException: ApplicationException + public class NotIncludedInRangeException: Exception { public NotIncludedInRangeException() : base() { } diff --git a/WinFormsLibrary1/UserDateTimePickercs.Designer.cs b/WinFormsLibrary1/UserDateTimePicker.Designer.cs similarity index 97% rename from WinFormsLibrary1/UserDateTimePickercs.Designer.cs rename to WinFormsLibrary1/UserDateTimePicker.Designer.cs index 900f4a6..7532c70 100644 --- a/WinFormsLibrary1/UserDateTimePickercs.Designer.cs +++ b/WinFormsLibrary1/UserDateTimePicker.Designer.cs @@ -1,6 +1,6 @@ namespace COP { - partial class UserDateTimePickercs + partial class UserDateTimePicker { /// /// Обязательная переменная конструктора. diff --git a/WinFormsLibrary1/UserDateTimePickercs.cs b/WinFormsLibrary1/UserDateTimePicker.cs similarity index 85% rename from WinFormsLibrary1/UserDateTimePickercs.cs rename to WinFormsLibrary1/UserDateTimePicker.cs index b52fa25..0a08edc 100644 --- a/WinFormsLibrary1/UserDateTimePickercs.cs +++ b/WinFormsLibrary1/UserDateTimePicker.cs @@ -11,13 +11,13 @@ using COP.Exceptions; namespace COP { - public partial class UserDateTimePickercs : UserControl + public partial class UserDateTimePicker : UserControl { private DateTime? minValue; private DateTime? maxValue; public event EventHandler? _valueChanged; - public UserDateTimePickercs() + public UserDateTimePicker() { InitializeComponent(); @@ -44,9 +44,9 @@ namespace COP else if (dateTimePicker.Value < minValue || dateTimePicker.Value > maxValue) { - - return null; - } + throw new NotIncludedInRangeException("Selected value is out of range."); + + } return dateTimePicker.Value; } @@ -60,8 +60,9 @@ namespace COP if (value < minValue || value > maxValue) { - throw new NotIncludedInRangeException("Selected value is out of range."); - } + return; + + } dateTimePicker.Value = value.Value; diff --git a/WinFormsLibrary1/UserDateTimePickercs.resx b/WinFormsLibrary1/UserDateTimePicker.resx similarity index 100% rename from WinFormsLibrary1/UserDateTimePickercs.resx rename to WinFormsLibrary1/UserDateTimePicker.resx diff --git a/WinFormsLibrary1/UserTreeView.Designer.cs b/WinFormsLibrary1/UserTreeView.Designer.cs new file mode 100644 index 0000000..5f1b0ac --- /dev/null +++ b/WinFormsLibrary1/UserTreeView.Designer.cs @@ -0,0 +1,55 @@ +namespace COP +{ + partial class UserTreeView + { + /// + /// Обязательная переменная конструктора. + /// + 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() + { + treeView = new TreeView(); + SuspendLayout(); + // + // treeView + // + treeView.Location = new Point(0, 0); + treeView.Name = "treeView"; + treeView.Size = new Size(150, 97); + treeView.TabIndex = 0; + // + // UserTreeView + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + Controls.Add(treeView); + Name = "UserTreeView"; + Size = new Size(150, 95); + ResumeLayout(false); + } + + #endregion + + private TreeView treeView; + } +} diff --git a/WinFormsLibrary1/UserTreeView.cs b/WinFormsLibrary1/UserTreeView.cs new file mode 100644 index 0000000..bad65f1 --- /dev/null +++ b/WinFormsLibrary1/UserTreeView.cs @@ -0,0 +1,95 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace COP +{ + public partial class UserTreeView : UserControl + { + public List Hierarchy; + public UserTreeView() + { + InitializeComponent(); + Hierarchy = new(); + } + public int SelectedItemIndex + { + get + { + if (treeView.SelectedNode == null) + { + return -1; + } + return treeView.SelectedNode.Index; + } + } + public T? GetSelectedObject() where T : class, new() + { + // параметризованный + //проверка есть или нет иерархии + TreeNode selectedNode = treeView.SelectedNode; + if (Hierarchy == null) + { + throw new Exception("Hierarchy is not set."); + } + if (selectedNode?.FirstNode != null) + { + throw new Exception("Not a last level node."); + } + T currentBranch = new T(); + Hierarchy.Reverse(); + foreach (var property in Hierarchy) + { + typeof(T).GetProperty(property).SetValue(currentBranch, Convert.ChangeType(selectedNode.Text, typeof(T).GetProperty(property).PropertyType)); + + selectedNode = selectedNode.Parent; + } + Hierarchy.Reverse(); + return currentBranch; + + } + public void PopulateTree(List items) + { + treeView.BeginUpdate(); + treeView.Nodes.Clear(); + if (items == null) + { + throw new ArgumentNullException(nameof(items)); + } + if (Hierarchy == null) + { + throw new Exception("Hierarchy is not set."); + } + + foreach (var item in items) + { + TreeNodeCollection treeViewNodes = treeView.Nodes; + foreach (var elem in Hierarchy) + { + bool flag = false; + for (int i = 0; i < treeViewNodes.Count; i++) + { + if (item.GetType().GetProperty(elem).GetValue(item).ToString() == treeViewNodes[i].Text) + { + treeViewNodes = treeViewNodes[i].Nodes; + flag = true; + break; + } + } + if (!flag) + { + var newNode = treeViewNodes.Add(item.GetType().GetProperty(elem).GetValue(item).ToString()); + treeViewNodes = newNode.Nodes; + } + } + } + treeView.EndUpdate(); + } + } +} diff --git a/WinFormsLibrary1/UserTreeView.resx b/WinFormsLibrary1/UserTreeView.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/WinFormsLibrary1/UserTreeView.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file