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();
    }

}

2013年9月4日水曜日

[SQL Server] SQL Serverでテーブル定義取得(全テーブル)

SQL Serverで、テーブル定義らしいものを取得するクエリです。
これとの違いは、データベース内のすべてのテーブルについて出力します。

select
 obj.name as 'テーブル名'
,col.name as '名称'
,(select top 1 name from systypes where systypes.xtype = col.xtype) as '型'
,col.length as '桁数'
,case isnull(col.scale,0)
 when 0 then ' '
 else cast( col.scale as char(10) )
 end '小数部'
,case  col.isnullable
 when 0 then '○'
 else ' '
 end 'nn'
,isnull((select case colid when 0 then '' else '○' end  from sysindexkeys as keys where col.id = keys.id  and col.colid = keys.colid and keys.indid = 1),' ') as 'pk'
,isnull((select top 1 ex.value from sys.extended_properties as ex where col.id = ex.major_id and ex.minor_id = col.colid and ex.name = 'ms_description' ),' ') as 'コメント'
from syscolumns as col
inner join sysobjects as obj on col.id = obj.id
where obj.name in  (select name from sysobjects where xtype = 'u')