ラベル C# の投稿を表示しています。 すべての投稿を表示
ラベル C# の投稿を表示しています。 すべての投稿を表示

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年4月23日火曜日

[c#]VSテストプロジェクトで単体テストのカバレッジが100%にならなかった点の対策

Visual Studio Team System 2008にてテストプロジェクトを利用して、単体テストを行っています。
また、このエディションではコードカバレッジを取れるので100%にすることも要件にしています。

その中で見た目は処理が通っているのですが、カバレッジが100%にならないケースが出てきました。
以下がその例です。


public void Method01(System.Windows.Forms.Control.ControlCollection list)
{
    List<control> wk = new List<control>();
    foreach (Control tmp in list)
    {
        if (tmp is Label) continue;
        wk.Add(tmp);
    }
}


Collectionをforeachしているだけなのですが、これが問題のようです。
詳しい理由はわかりませんが、裏方さんのコードに通らないパスがあるっポイです。
とにかく、Collectionをforeachするとダメなので、Listをforeachするように変える処理を入れます。


//CollectionをListに変換する
public List<t> ConvertList<t>(ICollection collection)
{
    List<t> ret = new List<t>();
    IEnumerator tmp = collection.GetEnumerator();
    
    while(tmp.MoveNext()) {
        ret.Add((T)tmp.Current);            
    }
    return ret;
}


それで、foreachの所でこのメソッドを使います。


public void Method01(System.Windows.Forms.Control.ControlCollection list)
{
    List<control> wk = new List<control>();
    foreach (Control tmp in ConvertList<Control>(list))
    {
        if (tmp is Label) continue;
        wk.Add(tmp);
    }
}


これでカバレッジが100%になるようになりました。

2012年7月6日金曜日

[Windows Phone]リソースの画像ファイル取得ではまった

リソースの画像ファイル(プロジェクトに登録した画像)を、プログラムから取り出して表示したかったのですが、なかなか取り出せませんでした。
1.pngファイルを Images/Category/Image01.pngとして登録
2.画像のプロパティ「ビルドアクション」を「コンテンツ」に設定
3.以下のコードで実行

StreamResourceInfo source = Application.GetResourceStream(new Uri("/Images/Category/Image01.png", UriKind.Relative));
BitmapImage bitmap = new BitmapImage();
bitmap.SetSource(source.Stream);
WriteableBitmap wb = new WriteableBitmap(bitmap);

これで実行しても、StreamResourceInfoはnullになってしまいます。
間違っているのは1行目のパス設定方法。
正しくは以下になります。

StreamResourceInfo source = Application.GetResourceStream(new Uri("Images/Category/Image01.png", UriKind.Relative));
画像パスの指定で先頭のスラッシュを消しました。
これで読み込むことが出来ました。

ルートがどこかは不明です。

2012年1月23日月曜日

[C#]画像に文字を埋め込んで保存する

画像の中心に指定の文字列を埋め込んで保存する処理です。
DOBON.NETさんを参考に保存のあたりの処理を加えています。


private void drawString(FileInfo copiedfi,string s,Font font)
{
 int quality = 85;

 //一時ファイルの作成
 string tmpFilename = copiedfi.FullName + ".tmp";
 FileInfo tmpFi = copiedfi.CopyTo(tmpFilename, true);

 //Bitmapオブジェクトの生成
 using (Bitmap bmp = new Bitmap(tmpFi.FullName))
 {
  //解像度の設定
  bmp.SetResolution(72, 72);

  //Graphicsオブジェクトを取得
  using (Graphics g = Graphics.FromImage(bmp))
  {
   //画像を描画する
   g.DrawImage(bmp, 0, 0, bmp.Width, bmp.Height);

   //白のブラシを作成する
   using( Brush b = new SolidBrush(System.Drawing.Color.White))
   {
    //文字の領域サイズを取得する
    StringFormat sf = new StringFormat();
    SizeF stringSize = g.MeasureString(s, font, bmp.Width, sf);

    //文字を描画する
    g.DrawString(s, font, b, (bmp.Width / 2) - (stringSize.Width / 2), (bmp.Height / 2) - (stringSize.Height / 2));
   }

  }

  //品質を指定
  System.Drawing.Imaging.EncoderParameters eps = new System.Drawing.Imaging.EncoderParameters(1);
  eps.Param[0] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);

  //エンコーダーを取得する
  System.Drawing.Imaging.ImageCodecInfo ici = this.getEncoderInfo("image/jpeg");

  bmp.Save(copiedfi.FullName, ici, eps);

 }

 //一時ファイルの削除
 if( File.Exists(tmpFilename) )File.Delete(tmpFilename);

}

//MimeTypeで指定されたImageCodecInfoを探して返す
private System.Drawing.Imaging.ImageCodecInfo getEncoderInfo(string mineType)
{
 //GDI+ に組み込まれたイメージ エンコーダに関する情報をすべて取得
 System.Drawing.Imaging.ImageCodecInfo[] encs = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders();
 //指定されたMimeTypeを探して見つかれば返す
 foreach (System.Drawing.Imaging.ImageCodecInfo enc in encs)
  if (enc.MimeType == mineType)
   return enc;
 return null;
}

2010年4月18日日曜日

[C#] SharpSVNを使ってSubversionを操作してみる

SharpSVNはSubvertionの.Net用クライアントライブラリ。 それを使って、ローカルのファイルを更新する処理のメモです。 ざっくりコードを乗せてみます。
using (SvnClient client = new SvnClient())
{

    //サーバー上のリポジトリ位置の設定
    SvnUriTarget repos = new SvnUriTarget(new Uri("file:///C:/svn_repository/SvnTest/"));
    //クライアントのファイル位置を設定
    SvnPathTarget local = new SvnPathTarget(@"C:\source\subvertionTest");

    //両方の情報を取得
    SvnInfoEventArgs serverInfo;
    SvnInfoEventArgs clientInfo;
    client.GetInfo(repos, out serverInfo);
    client.GetInfo(local, out clientInfo);

    //リビジョンを比較
    if (serverInfo.Revision != clientInfo.Revision)
    {
        SvnUpdateResult ret;
        //クライアントのファイルを最新に更新
        client.Update(@"C:\source\subvertionTest", out ret);
    }

    //ファイルの一覧取得用引数の指定
    SvnListArgs args = new SvnListArgs();
    //リビジョンを指定
    args.Revision = 2;
    //処理結果格納変数を定義
    System.Collections.ObjectModel.Collection list;
    //一覧の取得を実行
    client.GetList(repos, out list);

    //処理結果の表示
    foreach (var i in list)
    {
        switch (i.Entry.NodeKind)
        {
            case SvnNodeKind.Directory:
                Console.WriteLine("Directory:{0}",i.EntryUri.LocalPath);
                break;
            case SvnNodeKind.File:
                Console.WriteLine("File:{0}",i.EntryUri.LocalPath);
                break;
        }
    }
}

2010年3月30日火曜日

[WCF](暫定)WCFでSoapとRestを共通で

はじめてのWCFです。

ホントはRestとNamedPipeをやりたかったけど、IIS7.0がいるって事らしいのであきらめました。
なんで、SoapとRestの共通化(?)する方法。

まず、適当なWcfサービスを作って、「System.ServiceMode.Web」を参照設定する。
InterfaceにUsing System.ServiceMode.Web; なんて書いてGetMessageなんてメソッドを作る。
この時、Attributeに「WebGet」をつける。

[WebGet(UriTemplate = "GetMessage/{key}/")]
[OperationContract]
string GetMessage(string key);
実処理も適当に実装。
public string GetMessage(string key)
{
    return "IService1.GetMessage + " + key;
}
以上で、Wcfサービスのコーディングは完了。 後はWeb.Configの設定。 system.serviceModelの中を色々と変更。 まず、behaviorsを書く。

  
    
      
    
  
  
    
    
    
      
    
  

次にservices.serviceにendPointを書く。

  
    
    
    
  


addressのあたりをユニークに設定するとうまくいくらしい。

で、これを使うWebサイトを作って、Web参照すると普通にSoapで使える。
ブラウザから「http://localhost:8080/Service1.svc/Rest/GetMessage/TestMessage/」なんて打てば、
「IService1.GetMessage + TestMessage」
こんなレスポンスがもらえると。

2010年1月31日日曜日

[C#] List.ConvertAll

C# 3.0以上で出来ます。(VBでも出来るはず)

Listの値をCSV文字列に変換出来ます。

//Listをカンマ区切りの文字列に変換する
List lst = new List { 1, 3, 5, 7 };

string csv =
string.Join(",", lst.ConvertAll(
delegate(int value) { return value.ToString(); }).ToArray());


//カンマ区切りの文字列をListに変換する
lst = csv.Split(',').ToList().ConvertAll(
delegate(string value) { return int.Parse(value); });



1行で書くことが良いかは別として出来るんですね。
# 勝手にHTMLタグが書き込まれて消せない。。。

2009年10月20日火曜日

[C#] int?

知りませんでした。

int?

これがなんなのかを調べるのにも苦労しちゃいました。
検索エンジンで「?」なんて入れても引っかからないし。。。

ま、素直にMSDNを調べればわかったことなんですけどね。

Null値許容のint型って事なんですね。
.Net Framework 2.0の時点であったとは。。。

ちなにみVBだと

Dim i As Nullable(Of Int32)

って書くらしいです。

2009年2月4日水曜日

[C#]週番号の取得

VB6で言う所のDatePart(DateInterval.WeekOfYear, Now)をC#でやると。。。


Calendar cal = CultureInfo.CurrentCulture.Calendar;
CalendarWeekRule cwr = CultureInfo.CurrentCulture.DateTimeFormat.CalendarWeekRule;
DayOfWeek firstDay = DayOfWeek.Monday;

int weekNumber = cal.GetWeekOfYear(Target, cwr, firstDay);


こんな感じで取れました。
firstDayのあたりはお好みで。

2009年1月23日金曜日

[C#]配列のソート(例えばFileInfo)

FileInfoクラスの更新時間順にソートしたい!なんて時のやり方。


private FileInfo[] GetFiles
{
FileInfo[] fis;
//・・・(略)
Array.Sort(fis, delegate(FileInfo x, FileInfo y) { return x.LastWriteTime.CompareTo(y.LastWriteTime); });
}


あんまりC#の構文に詳しくないのですが、こんなのがメソッドの中に書けるんですね。
イケてるインデントの取り方がわかりません。
こうかな?

Array.Sort(
  fis
  ,
  delegate(FileInfo x, FileInfo y)
  {
    return x.LastWriteTime.CompareTo(y.LastWriteTime);
  }
);

2009年1月22日木曜日

[.Net]スレッドっていろいろある

.Netでのスレッドは大きく分けて以下の通り
1.Threadクラスを使う
2.ThreadPoolクラスを使う
3.デリゲートを使う

となる。

完全に個人的な考えだけど、それぞれの使い分けは
Threadクラス→戻り値がいらない処理で、スレッドを止めたい事がある場合。一番細かい制御が可能。
ThreadPoolクラス→性能を求められたら使う。
デリゲート→スレッドと言ったら基本的にこれ。戻り値が簡単に取れるしコーディングしやすい。

デリゲートの使い方の手順として
1.スレッド処理関数を作る
2.スレッド処理関数と同じ引数・戻り値のデリゲートを宣言し変数を宣言する。
3.コールバック関数を作る。戻り値はvoid、引数はIAsyncResultが1つだけ。
4.スレッドを呼び出す処理を書く。

サンプルは以下に。ただし、今回は処理が終わったことだけを知りたいので、戻り値も引数もなし。
・スレッド処理関数

private static void GetImageFromWebMain(){}


・デリゲート宣言

public delegate void GetImageFromWebDelegate();
public static GetImageFromWebDelegate getImageFromWebDelegate;


・コールバック関数

private static void GetImageFromWebCallBack(IAsyncResult ar){}


・スレッドを呼び出す処理

getImageFromWebDelegate = new GetImageFromWebDelegate(GetImageFromWebMain);
getImageFromWebDelegate.BeginInvoke(new AsyncCallback(GetImageFromWebCallBack), null);


ここにはお世話になってます。