for Push.

This commit is contained in:
nobobo
2026-06-01 13:23:34 +09:00
parent 9e093ea99f
commit a6550e9928
93 changed files with 10393 additions and 0 deletions
+79
View File
@@ -0,0 +1,79 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace KssSmaPlaLib.Forms.Controls
{
public class PoiDgv : DataGridView
{
private IContainer components;
[Category("Poi拡張"), Description("共通メニューを自動で追加するかどうか")]
public bool EnablePoiMenu { get; set; } = true;
/// <summary>
/// コンストラクタ
/// </summary>
public PoiDgv()
{
// これが今回の本命!
this.DoubleBuffered = true;
// DGB初期設定
this.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
this.RowHeadersVisible = false;
this.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
this.AllowUserToAddRows = false;
this.AllowUserToDeleteRows = false;
this.AllowUserToOrderColumns = true;
this.AllowUserToResizeColumns = true;
this.AllowUserToResizeRows = false;
this.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing;
}
/// <summary>
/// コンテキストメニュー設定時
/// </summary>
/// <param name="e"></param>
protected override void OnContextMenuStripChanged(EventArgs e)
{
base.OnContextMenuStripChanged(e);
// ユーザーがデザイナーでセットしたメニューに「Poi」のスパイスを加える
if (EnablePoiMenu && this.ContextMenuStrip != null)
{
var menu = this.ContextMenuStrip;
//// 重複防止チェック
//if (menu.Items.Find("poiItem_AutoFit", true).Length == 0)
//{
// if (menu.Items.Count > 0) menu.Items.Add(new ToolStripSeparator());
// var fitItem = new ToolStripMenuItem("列幅をぽいっと自動調整");
// fitItem.Name = "poiItem_AutoFit";
// fitItem.Click += (s, ev) => this.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
// menu.Items.Add(fitItem);
//}
}
}
private void InitializeComponent()
{
((System.ComponentModel.ISupportInitialize)(this)).BeginInit();
this.SuspendLayout();
//
// PoiDgv
//
this.RowTemplate.Height = 21;
((System.ComponentModel.ISupportInitialize)(this)).EndInit();
this.ResumeLayout(false);
}
}
}
+123
View File
@@ -0,0 +1,123 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
</root>
+588
View File
@@ -0,0 +1,588 @@
using DocumentFormat.OpenXml.VariantTypes;
using KssSmaPlaLib.Ini;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Windows.Media.Streaming.Adaptive;
namespace KssSmaPlaLib.Forms.Controls
{
/// <summary>
/// Poiメインフォーム
/// </summary>
public class PoiMainForm : Form
{
protected Label TitleLabel;
protected PoiDgv MainDgv;
protected ContextMenuStrip MainContextMenu;
protected ToolStripMenuItem TitleVisibleCheckMenu;
private ToolStripMenuItem _versionMenu;
private NumericUpDown _titleLabelYohakuHorizonNumeric = new NumericUpDown { Width = 60 };
private NumericUpDown _titleLabelYohakuVarticalNumeric = new NumericUpDown { Width = 60 };
// 👇遅延書き込みしようかと思ったがやめた!
//private Timer _saveDelayTimer = new Timer { Interval = 1000 };
private string _title = string.Empty;
/// <summary>
/// コンストラクタ
/// </summary>
public PoiMainForm(string title = "", string name = "")
{
// Name
this.Name = string.IsNullOrEmpty(name) ? this.GetType().Name : name;
// タイトル
_title = string.IsNullOrEmpty(title) ? this.Name : title;
this.Text = _title;
// フォームイベント
this.Load += PoiMainForm_Load;
this.FormClosing += PoiMainForm_FormClosing;
// コントロールの生成と配置
TitleLabel = new Label
{
Name = "TitleLabel",
AutoSize = true,
Dock = DockStyle.Top,
Text = "サンプルです💖",
};
TitleLabel.Padding = new Padding(20, 5, 8, 20);
MainDgv = new PoiDgv
{
Name = "MainDgv",
Dock = DockStyle.Fill
};
MainContextMenu = new ContextMenuStrip
{
Name = "MainContextMenu",
};
this.ContextMenuStrip = MainContextMenu;
this.Controls.Add(MainDgv);
this.Controls.Add(TitleLabel);
// デフォルトのメニュー項目登録
CreateDefaultMenu();
DgvHelper.DgvLoadFontFromIni(MainDgv);
//ContextMenuHelper.MenuCheckBoxItemLoad(this, TitleVisibleCheckMenu);
TitleLabel.Visible = TitleVisibleCheckMenu.Checked;
ContextMenuHelper.SetControlFont(this, TitleLabel);
ContextMenuHelper.DispVersion(_versionMenu);
// ソート無効
foreach (DataGridViewColumn column in MainDgv.Columns) column.SortMode = DataGridViewColumnSortMode.NotSortable;
//// 日の列はセンタリング
//for (var day = 1; day <= 31; day++) MainDgv.Columns[$"ColDay{day}"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
// TOTAL列は右寄せ
//MainDgv.Columns["ColTotal"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
// ヘッダ行のデザインはOSのデザインを反映させる機能を解除
MainDgv.EnableHeadersVisualStyles = false;
// 👇やろうかと思ったけどやめた!
//// 遅延書き込みタイマー
//_saveDelayTimer.Tick += (s, e) =>
//{
// _saveDelayTimer.Stop(); // タイマーを止める
// // 👑 ここでINIファイルへの書き込みを実行!
// // スピンボタン連打が「止まってから1秒後」に1回だけ綺麗に保存されます。
// aaaaaaa
//};
//LoadDataAsync();
// タイトル文字列設定
//TitleLabel.Text = GetTitle();
}
/// <summary>
/// フォームロード時
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
/// <exception cref="NotImplementedException"></exception>
private void PoiMainForm_Load(object sender, EventArgs e)
{
FormHelper.LoadFormBounds(this);
DgvHelper.DgvLoadFontFromIni(MainDgv);
DgvHelper.DgvLoadColWidth(MainDgv);
DgvHelper.DgvLoadHeaderHeight(MainDgv);
DgvHelper.DgvLoadColVisible(MainDgv);
DgvHelper.DgvLoadColDisplayIndex(MainDgv);
DgvHelper.DgvLoadColFrozen(MainDgv);
DgvHelper.DgvSetHeaderBackColorFromIni(this, MainDgv);
//DgvHelper.DgvSetHeaderBackColorFromIniWithNameMatch(this, MainDgv, "ColDay*", INI_KEY_HEADER_DAY_COLUMN_BACK_COLOR);
// 👇これはLoadでやらないと、子で作ってるメニューアイテムに反映されない!
ContextMenuHelper.LoadAllMenuStates(this, MainContextMenu);
ContextMenuHelper.SetFont(this, MainContextMenu);
var vertical =
int.TryParse(
IniHelper.ReadValue(null, this.Name, _titleLabelYohakuVarticalNumeric.Name, "0"),
out var intVal) ? intVal : 0;
var horizon =
int.TryParse(
IniHelper.ReadValue(null, this.Name, _titleLabelYohakuHorizonNumeric.Name, "0"),
out intVal) ? intVal : 0;
TitleLabel.Padding = new Padding(horizon, vertical, horizon, vertical);
}
/// <summary>
/// フォーム閉じるとき
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
/// <exception cref="NotImplementedException"></exception>
private void PoiMainForm_FormClosing(object sender, FormClosingEventArgs e)
{
FormHelper.SaveFormBounds(this);
DgvHelper.DgvSaveFontToIni(MainDgv);
DgvHelper.DgvSaveColWidth(MainDgv);
DgvHelper.DgvSaveHeaderHeight(MainDgv);
DgvHelper.DgvSaveColVisible(MainDgv);
DgvHelper.DgvSaveColDisplayIndex(MainDgv);
DgvHelper.DgvSaveColFrozen(MainDgv);
IniHelper.WriteValue(
null, this.Name,
_titleLabelYohakuHorizonNumeric.Name,
_titleLabelYohakuHorizonNumeric.Value.ToString());
IniHelper.WriteValue(
null, this.Name,
_titleLabelYohakuVarticalNumeric.Name,
_titleLabelYohakuVarticalNumeric.Value.ToString());
}
/// <summary>
/// デフォルトのメニュー項目(表示設定など)を作成
/// </summary>
private void CreateDefaultMenu()
{
// 仕切り線
MainContextMenu.Items.Add(new ToolStripSeparator());
// 表示設定(親)
var hyojiSetteiMenu = new ToolStripMenuItem()
{
Name = "HyojiSetteiMenu",
Text = "表示設定",
};
MainContextMenu.Items.Add(hyojiSetteiMenu);
// メニューのフォント(クリック動作)
var menuFontMenu = new ToolStripMenuItem()
{
Name = "MenuFontMenu",
Text = "メニューのフォント...",
};
menuFontMenu.Click += (s, e)=>
{
ContextMenuHelper.SelectMenuFont(this, MainContextMenu);
};
hyojiSetteiMenu.DropDownItems.Add(menuFontMenu);
// グリッドメニュー(親)
var gridMenu = new ToolStripMenuItem()
{
Name = "GridMenu",
Text = "グリッド",
};
hyojiSetteiMenu.DropDownItems.Add(gridMenu);
// グリッドフォントメニュー(クリック動作)
var gridFontMenu = new ToolStripMenuItem()
{
Name = "GridFontMenu",
Text = "フォント...",
};
gridFontMenu.Click += (s, e) =>
{
DgvHelper.DgvSelectFont(this, MainDgv);
};
gridMenu.DropDownItems.Add(gridFontMenu);
// グリッド列非表示メニュー(クリック動作)
var gridColumnDisabledMenu = new ToolStripMenuItem()
{
Name = "GridColumnDisabledMenu",
Text = "この列を非表示にする",
};
gridColumnDisabledMenu.Click += (s, e) =>
{
if (MainDgv.CurrentCell is null) return;
MainDgv.Columns[MainDgv.CurrentCell.ColumnIndex].Visible = false;
};
gridMenu.DropDownItems.Add(gridColumnDisabledMenu);
// グリッド列再表示メニュー(クリック動作)
var gridColumnRedispMenu = new ToolStripMenuItem()
{
Name = "GridColumnRedispMenu",
Text = "列の再表示",
};
gridColumnRedispMenu.Click += (s, e) =>
{
DgvHelper.DgvRedispAllColumn(MainDgv);
};
gridMenu.DropDownItems.Add(gridColumnRedispMenu);
// グリッド列幅自動調整メニュー(クリック動作)
var columnWidthAutoAdjustMenu = new ToolStripMenuItem()
{
Name = "ColumnWidthAutoAdjustMenu",
Text = "列幅の自動調整",
};
columnWidthAutoAdjustMenu.Click += (s, e) =>
{
DgvHelper.DgvColumnWidthAutoAdjust(MainDgv);
};
gridMenu.DropDownItems.Add(columnWidthAutoAdjustMenu);
// グリッド列固定メニュー(クリック動作)
var gridColumnFixMenu = new ToolStripMenuItem()
{
Name = "GridColumnFixMenu",
Text = "列固定",
};
gridColumnFixMenu.Click += (s, e) =>
{
DgvHelper.DgvColumnFix(MainDgv);
};
gridMenu.DropDownItems.Add(gridColumnFixMenu);
// グリッド列固定解除メニュー(クリック動作)
var gridColumnFixKaijoMenu = new ToolStripMenuItem()
{
Name = "GridColumnFixKaijoMenu",
Text = "列固定解除",
};
gridColumnFixKaijoMenu.Click += (s, e) =>
{
DgvHelper.DgvColumnFixKaijo(MainDgv);
};
gridMenu.DropDownItems.Add(gridColumnFixKaijoMenu);
// グリッドのヘッダ(親)
//this.GridHeaderMenu});
var gridHeaderMenu = new ToolStripMenuItem()
{
Name = "GridHeaderMenu",
Text = "ヘッダ",
};
gridMenu.DropDownItems.Add(gridHeaderMenu);
// グリッドヘッダ背景色(クリック動作)
var gridHeaderBackColorMenu = new ToolStripMenuItem()
{
Name = "GridHeaderBackColorMenu",
Text = "ヘッダ背景色...",
};
gridHeaderBackColorMenu.Click += (s, e) =>
{
DgvHelper.DgvSelectHeaderBackColor(this, MainDgv);
};
gridHeaderMenu.DropDownItems.Add(gridHeaderBackColorMenu);
// グリッドヘッダの日の背景色(クリック動作)
var gridHeaderDayBackColorMenu = new ToolStripMenuItem()
{
Name = "GridHeaderDayBackColorMenu",
Text = "日の背景色...",
Enabled = false, // デフォルトは非活性
};
gridHeaderDayBackColorMenu.Click += (s, e) =>
{
DgvHelper.DgvSelectHeaderBackColorWithNameMatch(this, MainDgv, "ColDay*", gridHeaderDayBackColorMenu.Name);
};
gridHeaderMenu.DropDownItems.Add(gridHeaderDayBackColorMenu);
// グリッドヘッダの非稼働日の背景色(クリック動作)
var gridHeaderHikadobiBackColorMenu = new ToolStripMenuItem()
{
Name = "GridHeaderHikadobiBackColorMenu",
Text = "非稼働日の背景色...",
Enabled = false, // デフォルトは非活性
};
gridHeaderHikadobiBackColorMenu.Click += (s, e) =>
{
// Comming soon!
MessageBox.Show(this,"カミングスーン!",this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
};
gridHeaderMenu.DropDownItems.Add(gridHeaderHikadobiBackColorMenu);
//this.GridHeaderMenu.DropDownItems.AddRange(
// new System.Windows.Forms.ToolStripItem[] {
//this.,
//this.,
//this.});
// グリッドメニューを開くときの制御
gridMenu.DropDownOpening += (s, e) =>
{
// 「この列の非表示」はアクティブセルがあるときだけ有効
gridColumnDisabledMenu.Enabled = !(MainDgv.CurrentCell is null);
// 「列の再表示」は非表示列があるときだけ有効
gridColumnRedispMenu.Enabled =
MainDgv.Columns.GetColumnCount(DataGridViewElementStates.Visible)
!= MainDgv.Columns.Count;
// 「列固定」はアクティブセルがあるときだけ有効
gridColumnFixMenu.Enabled = !(MainDgv.CurrentCell is null);
// 「列固定解除」は列固定がされているときだけ有効
gridColumnFixKaijoMenu.Enabled = MainDgv.Columns
.Cast<DataGridViewColumn>()
.Any(c => c.Frozen);
};
// タイトル(親)
var titleMenu =
new ToolStripMenuItem()
{
Name = "TitleMenu",
Text = "タイトル",
};
hyojiSetteiMenu.DropDownItems.Add(titleMenu);
// タイトル表示(チェックボックス)
TitleVisibleCheckMenu =
new ToolStripMenuItem()
{
Name = "TitleVisibleCheckMenu",
Text = "タイトル表示?",
CheckOnClick = true,
};
TitleVisibleCheckMenu.CheckedChanged += (s, e) =>
{
var mi = (ToolStripMenuItem)s;
IniHelper.WriteBoolValue(null, this.Name, mi.Name,
mi.Checked);
TitleLabel.Visible = mi.Checked;
};
titleMenu.DropDownItems.Add(TitleVisibleCheckMenu);
// タイトルフォントメニュー(クリック動作)
var titleFontMenu =
new ToolStripMenuItem()
{
Name = "TitleFontMenu",
Text = "フォント...",
};
titleFontMenu.Click += (s, e) =>
{
ContextMenuHelper.SelectControlFont(this, TitleLabel);
};
titleMenu.DropDownItems.Add(titleFontMenu);
// タイトル余白(親)
var titleYohakuMenu = new ToolStripMenuItem()
{
Name = "TitleYohakuMenu",
Text = "余白",
};
titleMenu.DropDownItems.Add(titleYohakuMenu);
// 余白設定パネル
titleYohakuMenu.DropDownItems.Add(CreateYohakuPanelMenu());
// 仕切り線
MainContextMenu.Items.Add(new ToolStripSeparator());
// バージョン表示メニュー(表示のみ)
_versionMenu =
new ToolStripMenuItem()
{
Name = "VersionMenu",
Text = "バージョン情報",
};
MainContextMenu.Items.Add(_versionMenu);
//titleMenu.DropDownItems.Add(CreateYohakuPanelMenu());
//MainContextMenu.Items.Add(CreateYohakuPanelMenu());
// 実験!✨✨✨
//// NumericUpDownを生成して設定
//NumericUpDown numericUpDown = new NumericUpDown();
//numericUpDown.Minimum = 0;
//numericUpDown.Maximum = 100;
//numericUpDown.Value = 10;
//numericUpDown.Width = 60; // メニュー内で邪魔にならない幅に調整
//// ToolStripControlHostでラップしてメニューに追加
//ToolStripControlHost host = new ToolStripControlHost(numericUpDown);
//MainContextMenu.Items.Add(host); // または menuStrip1.Items.Add(host);
}
/// <summary>
/// 余白調整パネルメニュー作成
/// </summary>
/// <returns></returns>
private ToolStripControlHost CreateYohakuPanelMenu()
{
// 1. 土台となるパネル(縦方向にコントロールを並べる)
TableLayoutPanel miniDialog = new TableLayoutPanel();
miniDialog.ColumnCount = 2; // 2列のグリッド
miniDialog.RowCount = 2; // 3; // 3行
miniDialog.AutoSize = true;
miniDialog.Padding = new Padding(10); // 周囲に余白を作ってダイアログ感を出す
miniDialog.BackColor = Color.FromArgb(240, 240, 240); // ほんのり背景色を変える
// 2. コントロール達を作成
Label lblX = new Label { Text = "横余白:", AutoSize = true, Anchor = AnchorStyles.Left };
_titleLabelYohakuHorizonNumeric = new NumericUpDown
{
Name = "TitleLabelYohakuHorizonNumeric",
Width = 60,
TextAlign = HorizontalAlignment.Right,
};
_titleLabelYohakuHorizonNumeric.ValueChanged += (sender, e) =>
{
TitleLabel.Padding = new Padding(
(int)_titleLabelYohakuHorizonNumeric.Value,
TitleLabel.Padding.Top,
(int)_titleLabelYohakuHorizonNumeric.Value,
TitleLabel.Padding.Bottom);
// 🔥🌊INI書きはFormClosingで行う!
};
Label lblY = new Label { Text = "縦余白:", AutoSize = true, Anchor = AnchorStyles.Left };
_titleLabelYohakuVarticalNumeric = new NumericUpDown
{
Name = "TitleLabelYohakuVarticalNumeric",
Width = 60,
TextAlign = HorizontalAlignment.Right,
};
_titleLabelYohakuVarticalNumeric.ValueChanged += (sender, e) =>
{
TitleLabel.Padding = new Padding(
TitleLabel.Padding.Left,
(int)_titleLabelYohakuVarticalNumeric.Value,
TitleLabel.Padding.Right,
(int)_titleLabelYohakuVarticalNumeric.Value);
// 🔥🌊INI書きはFormClosingで行う!
};
//CheckBox chkAuto = new CheckBox { Text = "自動調整", AutoSize = true };
// 3. グリッドパネルに綺麗に配置
miniDialog.Controls.Add(lblX, 0, 0);
miniDialog.Controls.Add(_titleLabelYohakuHorizonNumeric, 1, 0);
miniDialog.Controls.Add(lblY, 0, 1);
miniDialog.Controls.Add(_titleLabelYohakuVarticalNumeric, 1, 1);
//// チェックボックスは2列分ぶち抜きで配置
//miniDialog.Controls.Add(chkAuto, 0, 2);
//miniDialog.SetColumnSpan(chkAuto, 2);
// 4. メニューにホストする
//ToolStripControlHost dialogHost = new ToolStripControlHost(miniDialog);
//MainContextMenu.Items.Add(dialogHost);
// 開くときの処理
var tssh = new ToolStripControlHost(miniDialog);
tssh.OwnerChanged += (sender, e) =>
{
// 親となるメニュー(ToolStripDropDown)を取得
if (tssh.Owner is ToolStripDropDown parentMenu)
{
// 親の「開く直前イベント」に、自分のメソッドをこっそり登録する!
parentMenu.Opening -= ParentMenu_Opening; // 二重登録防止
parentMenu.Opening += ParentMenu_Opening;
}
};
return tssh;
}
/// <summary>
/// 親メニュー開くときに追加する処理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ParentMenu_Opening(object sender, System.ComponentModel.CancelEventArgs e)
{
//// フォントを親に合わせる(階層深いと反映されないため)
//_titleLabelYohakuHorizonNumeric.Font =
// _titleLabelYohakuVarticalNumeric.Font =
// MainContextMenu.Font;
// パネルの合わせ、再レイアウト(パネルが階層奥深くだと、なぜか反映されていなかったりする)
var parent = _titleLabelYohakuHorizonNumeric.Parent;
if (parent != null)
{
parent.Font = MainContextMenu.Font;
parent.PerformLayout();
}
// タイトルラベルの現在の余白をNumericUpDownに設定
_titleLabelYohakuHorizonNumeric.Value = TitleLabel.Padding.Left;
_titleLabelYohakuVarticalNumeric.Value = TitleLabel.Padding.Top;
}
/// <summary>
/// メニュー項目追加
/// </summary>
/// <param name="text"></param>
/// <param name="name"></param>
/// <param name="defaultValue"></param>
/// <param name="onCheckedChanged"></param>
/// <returns></returns>
protected ToolStripMenuItem AddCheckMenuItem(
int index,
string text,
string name,
bool defaultValue,
Action<bool> onCheckedChanged = null)
{
var item = new ToolStripMenuItem(text);
// チェックボックスとして機能する
item.CheckOnClick = true;
item.Name = name;
// 3. CheckedChanged イベントをここで一括で仕込む!
item.CheckedChanged += (sender, e) =>
{
var mi = (ToolStripMenuItem)sender;
// チェック値をINI保存
IniHelper.WriteBoolValue(null, this.Name, mi.Name, mi.Checked);
// イベントプロシージャ(あるとき)
onCheckedChanged?.Invoke(mi.Checked);
};
MainContextMenu.Items.Insert(index, item);
return item;
}
public enum PoiAlign
{
Left,
Right,
Center,
}
private DataGridViewContentAlignment GetDgvAlign(PoiAlign align)
{
switch (align)
{
case PoiAlign.Left: return DataGridViewContentAlignment.MiddleLeft;
case PoiAlign.Center: return DataGridViewContentAlignment.MiddleCenter;
case PoiAlign.Right: return DataGridViewContentAlignment.MiddleRight;
default: return DataGridViewContentAlignment.MiddleLeft;
}
}
/// <summary>
/// 列追加
/// </summary>
/// <param name="name"></param>
/// <param name="text"></param>
/// <param name="align"></param>
protected void AddColumn(string name, string text, PoiAlign align = PoiAlign.Left)
{
var col = new DataGridViewTextBoxColumn()
{
Name = name,
HeaderText = text,
ReadOnly = true,
};
col.DefaultCellStyle.Alignment = GetDgvAlign(align);
MainDgv.Columns.Add(col);
}
}
}