| File: System\Windows\Forms\Design\StringCollectionEditor.StringCollectionForm.cs | Web Access |
| Project: src\winforms\src\System.Windows.Forms.Design\src\System.Windows.Forms.Design.csproj (System.Windows.Forms.Design) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.ComponentModel; using System.ComponentModel.Design; namespace System.Windows.Forms.Design; internal partial class StringCollectionEditor { /// <summary> /// StringCollectionForm allows visible editing of a string array. /// Each line in the edit box is an array entry. /// </summary> private class StringCollectionForm : CollectionForm { private Label _instruction; private TextBox _textEntry; private Button _okButton; private Button _cancelButton; private TableLayoutPanel _overarchingLayoutPanel; private readonly StringCollectionEditor _editor; /// <summary> /// Constructs a StringCollectionForm. /// </summary> public StringCollectionForm(CollectionEditor editor) : base(editor) { _editor = (StringCollectionEditor)editor; InitializeComponent(); HookEvents(); } private void Edit1_keyDown(object? sender, KeyEventArgs e) { if (e.KeyCode != Keys.Escape) { return; } _cancelButton.PerformClick(); e.Handled = true; } private void StringCollectionEditor_HelpButtonClicked(object? sender, CancelEventArgs e) { e.Cancel = true; _editor.ShowHelp(); } private void Form_HelpRequested(object? sender, HelpEventArgs e) { _editor.ShowHelp(); } private void HookEvents() { _textEntry.KeyDown += Edit1_keyDown; _okButton.Click += OKButton_click; HelpButtonClicked += StringCollectionEditor_HelpButtonClicked; } /// <summary> /// NOTE: The following code is required by the form designer. /// It can be modified using the form editor. Do not modify it using the code editor. /// </summary> [MemberNotNull(nameof(_instruction))] [MemberNotNull(nameof(_textEntry))] [MemberNotNull(nameof(_okButton))] [MemberNotNull(nameof(_cancelButton))] [MemberNotNull(nameof(_overarchingLayoutPanel))] private void InitializeComponent() { ComponentResourceManager resources = new(typeof(StringCollectionEditor)); _instruction = new Label(); _textEntry = new TextBox(); _okButton = new Button(); _cancelButton = new Button(); _overarchingLayoutPanel = new TableLayoutPanel(); _overarchingLayoutPanel.SuspendLayout(); SuspendLayout(); // instruction // resources.ApplyResources(_instruction, "instruction"); _overarchingLayoutPanel.SetColumnSpan(_instruction, 2); _instruction.Name = "instruction"; // // textEntry // resources.ApplyResources(_textEntry, "textEntry"); _overarchingLayoutPanel.SetColumnSpan(_textEntry, 2); _textEntry.AcceptsTab = true; _textEntry.AcceptsReturn = true; _textEntry.Name = "textEntry"; // // okButton // resources.ApplyResources(_okButton, "okButton"); _okButton.DialogResult = DialogResult.OK; _okButton.Name = "okButton"; // // cancelButton // resources.ApplyResources(_cancelButton, "cancelButton"); _cancelButton.DialogResult = DialogResult.Cancel; _cancelButton.Name = "cancelButton"; // // overarchingLayoutPanel // resources.ApplyResources(_overarchingLayoutPanel, "overarchingLayoutPanel"); _overarchingLayoutPanel.Controls.Add(_instruction, 0, 0); _overarchingLayoutPanel.Controls.Add(_textEntry, 0, 2); _overarchingLayoutPanel.Controls.Add(_okButton, 0, 3); _overarchingLayoutPanel.Controls.Add(_cancelButton, 1, 3); _overarchingLayoutPanel.Name = "overarchingLayoutPanel"; // // StringCollectionEditor // resources.ApplyResources(this, "$this"); AutoScaleMode = AutoScaleMode.Font; Controls.Add(_overarchingLayoutPanel); HelpButton = true; MaximizeBox = false; MinimizeBox = false; Name = "StringCollectionEditor"; ShowIcon = false; ShowInTaskbar = false; _overarchingLayoutPanel.ResumeLayout(false); _overarchingLayoutPanel.PerformLayout(); HelpRequested += Form_HelpRequested; ResumeLayout(false); PerformLayout(); } /// <summary> /// Commits the changes to the editor. /// </summary> private void OKButton_click(object? sender, EventArgs e) { // Split the text into array of lines. string[] lines = _textEntry.Text.Split('\n'); // Remove trailing carriage return characters. for (int i = 0; i < lines.Length; i++) { lines[i] = lines[i].TrimEnd('\r'); } // Check if the content has changed. if (lines.Length != Items.Length) { UpdateItems(lines); return; } for (int i = 0; i < lines.Length; ++i) { if (!lines[i].Equals(Items[i]?.ToString())) { UpdateItems(lines); return; } } DialogResult = DialogResult.Cancel; void UpdateItems(string[] newLines) { // If the last line is empty, we don't want to create an item from it. if (newLines[^1].Length == 0) { Array.Resize(ref newLines, newLines.Length - 1); } // Assign newLines to Items. Items = newLines; } } /// <summary> /// This is called when the value property in the CollectionForm has changed. /// In it you should update your user interface to reflect the current value. /// </summary> protected override void OnEditValueChanged() => _textEntry.Text = string.Join(Environment.NewLine, Items); } }