ComboBoxの見た目と中身を別にする

コンボボックスの見た目と欲しいデータが別なんてことはよくあることですね。
簡単な物だったら匿名クラスを使ってちょいちょいです。

this.comboBox1.ValueMember = "value";
this.comboBox1.DisplayMember = "display";
this.comboBox1.DataSource = new[]{
	new { value="1", display="でーた1" },
	new { value="2", display="でーた2"},
	new { value="3", display="でーた3"},
	new { value="4", display="でーた4"},
	new { value="5", display="でーた5"},
};
//ValueMember と DisplayMember はデザイナーの方で指定したほうがスッキリすると思うます

DisplayMember が見た目に使うプロパティ名
ValueMember が実際のデータのプロパティ名 になります。

this.comboBox1.SelectedValueにデータバインドをしておけばvalueが勝手に取得できて楽になります。

ユーザーコントロールのスナップを自作する

ユーザーコントロールを作成してテキストボックスなんか置いたりすると、スナップ(ピンクの線)が消えてしまって配置するのがめんどくさくなります。
そこで、ユーザーコントロールにもスナップを追加します。

とりあえずUserControlを継承したクラスを作成します。
この後作成するスナップ付きのユーザーコントロールにこのクラスを使います。

[Designer(typeof(UserControlSnapLineDesigner))]
public class UserControlBase: UserControl {
	protected virtual Control SnapLineControl { get { return null; } }

	private class UserControlSnapLineDesigner: ControlDesigner {
		public override IList SnapLines {
			get {
				IList snapLines = base.SnapLines;

				Control targetControl = ( this.Control as UserControlBase ).SnapLineControl;

				if( targetControl == null )
					return snapLines;

				using( ControlDesigner controlDesigner = TypeDescriptor.CreateDesigner(targetControl,
					typeof(IDesigner)) as ControlDesigner ) {
					if( controlDesigner == null )
						return snapLines;

					controlDesigner.Initialize(targetControl);

					foreach( SnapLine line in controlDesigner.SnapLines ) {
						if( line.SnapLineType == SnapLineType.Baseline ) {
							snapLines.Add(new SnapLine(SnapLineType.Baseline, line.Offset + targetControl.Top,
								line.Filter, line.Priority));
							break;
						}
					}
				}
				return snapLines;
			}
		}
	}
}

先ほど作ったクラスを使用してユーザーコントロールを作成します。
作成するユーザーコントロールにはテキストボックスが配置してあり、このテキストボックスのスナップを持ってきます。

UserControlBase で作成したSnapLineControlをオーバーライドでコントロールを指定します。

public partial class ユーザーコントロール: UserControlBase {
	
	// ~ 細かいところは省略します ~
	
	//ここで指定するだけ↓
	protected override Control SnapLineControl {
		get {
			return this.textBox1;
		}
	}
}

これでテキストボックスのピンクの線がユーザーコントロールにもつくようになりました。

引用:.net - Baseline snaplines in custom Winforms controls - Stack Overflow

自作プロパティを(DataBindings)に追加する方法

Visual Studioで自作プロパティをデザイナー内の(DataBindings)に追加する方法

System.ComponentModel.Bindable(true)をプロパティに付けましょう

[System.ComponentModel.Bindable(true)]
public int プロパティ{ get;set; }

デザイナーから直接いじれるのは便利です。

キーが押されているか調べる

Control.MouseButtons とか Control.ModifierKeysを使うだけ

2つのキー同時押しはビット演算を使いましょう。

if( ( Control.MouseButtons & MouseButtons.Right ) == MouseButtons.Right ) {
	if( ( Control.ModifierKeys & ( Keys.Control | Keys.Shift ) ) == ( Keys.Shift | Keys.Control ) ) {
		// キー押されてます
	}
}

はてなブログのソースコード記述

はてな記法で、csは小文字じゃないとダメなのね・・・

>|cs|
// C#
/// <summary>
/// MainWindow の ViewModel です。
/// </summary>
class MainWindowViewModel {
    /// <summary>
    /// Hoge を取得または設定します。
    /// </summary>
    public String Hoge { get; set; }
}
 ||<
↑ここのスペースを消すべし!