2013年11月12日火曜日

[c#]DataGridViewのマウスホイールでのスクロールを1行単位にする

こちらのサイトにありました。

 DataGridViewはマウスホイールのスクロールで3行送りです。(OS設定に依存します)
このスクロール量を1行送りに変えます。

DataGridViewを継承したクラスを作って、OnMouseWheelでチョイチョイとすればいい感じになります。

MouseEventArgsコンストラクターの第5引数が若干意味不明です。
なにやら、マウスホイールの1ラッチで120単位の移動量となるとか、説明を見てもよくわかりません。

実行すると、マウスホイールを手前に1ラッチすると、e.Deltaには-120が入っています。
MouseWheelScrollLinesには3が入っています。

つまり、第5引数には-40を設定すれば、1行送りになるかというと、確かにそうなります。
マウスの設定でスクロールする行数を1に変更しても、e.Deltaには-120が入ってきます。
この場合、-120でも1行送りになります。

どういう仕組なの?

よくわかりませんが、結果オーライで行きます。

public class DataGridViewEx : DataGridView
{
    // ホイールマウス制御
    protected override void OnMouseWheel(MouseEventArgs e)
    {
        // マウス ホイールを回転したときにスクロールする行数を取得
        Int32 scroll = SystemInformation.MouseWheelScrollLines;

        // MouseEventArgsクラスの移動量を1行に変更
        MouseEventArgs ex = new MouseEventArgs(e.Button, e.Clicks, e.X, e.Y, e.Delta / scroll);

        base.OnMouseWheel(ex);
    }
}

2013年11月1日金曜日

[c#]フォームが1つしか表示されないようにする

メインフォームとサブフォームがあって、サブフォームはモードレスで表示する場合に、サブフォームが1つだけ表示されるようにする方法です。


private SubForm _subForm = null;
private void showSubForm()
{
    //フォームが表示されているかの判定
    if (this._subForm == null || this._subForm.IsDisposed)
        this._subForm = new PlanListForm();

    if (!this._subForm.Visible)
    {
        this._subForm.Show();
    }
    else
    {
        this._subForm.Activate();
    }

}