コントロールの背景を透過色にする
コントロールの背景を透過色にするには、
- コントロールの BackColor プロパティに Color.Transparent を設定する。
using System; using System.Drawing; using System.Windows.Forms; namespace TransparentLabel { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { checkBox1.BackColor = Color.Transparent; radioButton1.BackColor = Color.Transparent; label1.BackColor = Color.Transparent; button1.BackColor = Color.Transparent; } } }
DataGridView の行や列に区切りを入れる
DataGridView の行や列に区切りを入れるときは、
を設定する。
using System; using System.Windows.Forms; namespace DataGridViewDividerWidthSample { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { for (Int32 columnIndex = 0; columnIndex < 3; ++columnIndex) { String name = String.Format("カラム {0}", columnIndex + 1); dataGridView1.Columns.Add(name, name); } for (Int32 rowIndex = 0; rowIndex < 3; ++rowIndex) { dataGridView1.Rows.Add(); } dataGridView1.Columns[1].DividerWidth = 2; dataGridView1.Rows[1].DividerHeight = 2; } } }
DataGridView の描画が遅いときに気をつけること
DataGridView で、
のプロパティが、自動に設定されているとき、
- 行や列の追加
- セルに値を設定
すると、描画が遅くなる。
以下の例では、50 x 50 で 9.2 秒かかった。
using System; using System.Diagnostics; using System.Windows.Forms; namespace DataGridViewSizeModeAndSpeed { public partial class Form1 : Form { private const int ColumnCount = 50; private const int RowCount = 50; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { var sw = new Stopwatch(); sw.Start(); // サイズ設定が自動のとき、行や列を追加したり、セルに値を設定すると、実行が遅くなる。 dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells; dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; AddColumns(); AddRows(); SetValues(); sw.Stop(); label1.Text = String.Format("所要時間: {0}", sw.Elapsed); } private void AddColumns() { for (int index = 0; index < ColumnCount; ++index) { AddColumn(index + 1); } } private void AddColumn(int columnNumber) { var column = new DataGridViewColumn(); column.Name = columnNumber.ToString(); column.CellTemplate = new DataGridViewTextBoxCell(); dataGridView1.Columns.Add(column); } private void AddRows() { for (int index = 0; index < RowCount; ++index) { dataGridView1.Rows.Add(); } } private void SetValues() { for (int columnIndex = 0; columnIndex < ColumnCount; ++columnIndex) { for (int rowIndex = 0; rowIndex < RowCount; ++rowIndex) { String value = String.Format("{0}-{1}", columnIndex + 1, rowIndex + 1); dataGridView1[columnIndex, rowIndex].Value = value; } } } } }
順番を、
- 自動サイズ設定しない。
- 行や列を追加、セルに値を設定。
- 自動サイズ設定する。
に変更すると、描画時間は 0.15 秒になった。
private void Form1_Load(object sender, EventArgs e) { var sw = new Stopwatch(); sw.Start(); // 行や列を追加したり、セルに値を設定するときは、自動サイズ設定しない。 dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None; dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None; dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing; AddColumns(); AddRows(); SetValues(); // 自動でサイズを設定するのは、行や列を追加したり、セルに値を設定した後にする。 dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells; dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; sw.Stop(); label1.Text = String.Format("所要時間: {0}", sw.Elapsed); }
Emacs での長方形の範囲の取り扱い
Emacs では長方形の範囲を取り扱える。
たとえば以下のようなテキストで、左にある日付の部分を、右に移動したいとすると、
'1. C-@ や C-SPC (set-mark-command) で角にマークを付けて、
'2. 長方形の対角にカーソルを移動し、
'3. M-x copy-rectangle-to-register で、長方形の範囲の内容を、たとえばレジスタ a にコピーする。
'4. M-x delete-rectangle で、長方形の範囲を削除し、
'5. 長方形を挿入する位置へカーソルを移動し、
'6. M-x insert-register で、'3 で内容を保存したレジスタ a を指定する。
Emacs のキーボードマクロ
テキスト編集で同じ操作を繰り返すなら、Emacs の キーボードマクロ が便利。
例えば、以下のような内容の各行をダブルクォートで囲むとすると、
- C-x ( → キーボードマクロ定義開始。ステータス行に "Defining kbd macro..." と表示される。
- 繰り返す操作を入力。ここでは、
- " → ダブルクォート入力
- C-e → 行の最後に移動
- " → ダブルクォート入力
- C-n → 次の行に移動
- C-a → 行の最初に移動
- C-x ) → キーボードマクロ定義終了。ステータス行に "Keybord macro defined" と表示される。
定義したキーボードマクロを実行するには C-x e を入力。繰り返し実行するには C-u (universal-argument) を使う。C-u 1 0 C-x e で 10 回実行してみるとこうなる。