スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[C#]テキストボックスで『全て選択』がしたい

[C#]テキストボックスで Ctrl+A(全て選択)がしたい

テキストエディタでは当たり前のように使用できる、Ctrl+Aによる全て選択は、デフォルトのテキストボックスでは
使用できない。 意外に不便なので、実装してあげる。
.

private void textBox_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == System.Windows.Forms.Keys.A & e.Control == true)
    {
        textBox.SelectAll();
    }
}

.
テキストボックスのイベント『KeyDown』に設定すればおk。
別にCtrl+Aじゃなくてもいいっていうなら、[ System.Windows.Forms.Keys.A & e.Control ]の部分を
変えても問題ない。


これで、全て選択ができるようになるけど、テキストボックスを配置する度に上記のコードを設定するのは
かなり面倒くさい。
なので、次は全て選択の機能(イベント)をデフォルトで使用できるテキストボックスを作る方法・・・
カスタムコントロールについて書こうと思う。
.
.
C#によるコンポーネントプログラミング C#によるコンポーネントプログラミング
瀬尾 佳隆

オーム社
売り上げランキング : 374545

Amazonで詳しく見る

[C#]データベースに接続 backgroundWorker追加

C# BackgroundWorkerを使用してみる

.
以前書いたDB接続記事のだと、ちょっと多いレコード読み込むと画面が真っ白になって、操作不能になる。
それは放置していた問題だったが、最近それでかなりイライラさせられた。
なので前回のコードにBackgroundWorkerを加え、バックグラウンドでレコードを取得できるように改修することにした。
改修するにあたって、MSDNと@ITの記事を参考にした。

■参考記事
Windows フォーム コントロールのスレッド セーフな呼び出しを行う
時間のかかる処理をバックグラウンドで実行するには?[2.0のみ、C#、VB]

正直言うと、MSDNにかなり分かりやすいサンプルコードがあって驚いた。
一部分なんか丸々使えた。感謝。
@ITのは、実際にソースコードをダウンロードして、BackgroundWorkerの動きを確認するのに役立った。

で、できたコードは以下に記載。
縦に長すぎて、全体が把握しづらい。
あと、うちのブログには横幅が足りないと思うんだ・・・。
.

[C#]NumericUpDownのReadOnlyをTrueにしても

■NumericUpDownのReadOnlyって変じゃね?
NumericUpDownのReadOnlyをTrueにすると、以下のような状態になる。
nume1 

よし、これで読み取り専用になった・・・と思ったら、矢印キーをクリックしたら普通に値が増減する。
アレ困ったなと思って、色々なキーワードで検索しても、情報が見つからない。

結局読み取り専用かつ、矢印キーによる増減を制限するには、以下のようにした。

numericUpDown1.ReadOnly = true;
numericUpDown1.Increment = 0;


まず、ReadOnlyのプロパティをTrueにする。
さらに矢印キーによる増減を0に設定し、実質値が変更できないようにした。
すごく・・・力技です。

もっとスマートにやる方法があるかもしれないけど。とりあえずメモ。

C#ルールブック ~読みやすく効率的なコードの原則 C#ルールブック ~読みやすく効率的なコードの原則
向山 隆行,片山 優司,阿部 順一,寺田 和朗,畑中 良平
電通国際情報サービス

技術評論社
売り上げランキング : 12657

Amazonで詳しく見る

【SQLServer】SQL メモ

■SQL内のテーブル名を変数で渡す
execを使う。ストアドは勿論のこと、同じテーブル名が数回出てくるSQLの時も役立つ。

DECLARE @tblname varchar(50)
SET @tblname = 'tbl_TEST'
exec('SELECT * from [' + @tblname + ']')


■BULK INSERT
テーブルにテキストファイルから一括して、入れ込める。便利。
WITH以降のオプションでテキストファイル内の区切り文字は変更可。

参考:MSDN フィールド ターミネータと行ターミネータの指定

BULK INSERT tbl_TEST FROM 'C:\filepass,txt'
WITH (FIELDTERMINATOR = '\t',ROWTERMINATOR = '\n'

注意点:テキストファイルは、INSERTしたいDB(テーブル)があるとこに配置しないといけない。 
.  

SQLパズル 第2版 プログラミングが変わる書き方/考え方 SQLパズル 第2版 プログラミングが変わる書き方/考え方
ジョー・セルコ,Joe Celko,ミック

翔泳社
売り上げランキング : 33502

Amazonで詳しく見る

[C#]データベースに接続する

■C# DB接続
C#から SQL Server 2005 に接続する。

載せるのは、SqlDataAdapter を使用する方法。
#勿論、SqlConnectionを使うこっちの方法でも有り。
  ○ADO.NET で SQL Server に接続する

using System.Data.SqlClientして、フォームにボタンひとつ、テキストボックスを配置して
ボタンのイベントに以下のコードを書く。

private void button1_Click(object sender, EventArgs e)
{
    DataSet _readDB = new DataSet();

    string ConnectionString = "Persist Security Info=False;User ID=sa;Password=XXXXX;Initial Catalog=DBNAME; Server=10.100.xxx.xxx;";

    SqlDataAdapter sqlAdapter = new SqlDataAdapter("select top 10 * from dbo.tbl_TEST", ConnectionString);

    sqlAdapter.Fill(_readDB);

    //区切り文字
    string sptword = "\t";

    foreach (DataRow rowline in _readDB.Tables[0].Rows)
    {
        foreach (var rowitem in rowline.ItemArray)
        {
            textBox1.Text += rowitem.ToString().Trim() + sptword;
        }
        textBox1.Text += Environment.NewLine;
    }
}


[やってること]
DBに対してSQLを実行して、結果をテキストボックスにタブ区切りで取得。
[ string sptword = "\t"; ]を変えれば、違う区切り文字にもできる。




小さなチーム、大きな仕事―37シグナルズ成功の法則

Ironpython urllib2 が動かない 俺の土曜日ちゃんが息してない

■Ironpython urllib2が動かないってばよ・・・


     ∩___∩     /゙ミヽ、,,___,,/゙ヽ
     | 丿     ヽ    i ノ       `ヽ'
    /  ○   ○ |    / `(○)  (○)´i、  先生助けてっ!、
    | U  ( _●_)  ミ  彡,U ミ(__,▼_)彡ミ   土曜日ちゃんが息をしてないのっっ!!
   彡、    |∪| ,,/   ,へ、,   |∪|  /゙
   /  ヽ  ヽノ  ヾ_,,..,,,,_ /  '  ヽノ `/´ ヽ
   |      ヽ  ./ ,' 3  `ヽーっ   /    |
   │   ヾ    ヾl   ⊃ ⌒_つ ソ      │
   │    \__`'ー-⊃⊂'''''"__,,,ノ   |


VisualStudio2010 + Ironpython2.7 に手出してた。
そんで、さっそくはまった。

Ironpython で urllib.urlopen が動かない・・・。
でも、もう1時間はまってるのに、あきらめたくないよ・・・。


そんな風にしてたら、4時間経過してた件。




だが、解決した!

同じ理由ではまる人が現れて、ここで解決できることを願い、メモする。


■問題
urllib.urlopen を使うと以下のメッセージが表示され、動かない
[メッセージ]
TypeError: create_connection() takes at most 2 arguments (3 given)


■解決方法
この問題はIronpythonの公式サイトでも取り上げられていた。
http://ironpython.codeplex.com/workitem/28185

以下の作業を行う。

[修正ファイル]
ファイル名:@httplib.py
デフォルトパスで Ironpython をインストールした場合は、以下の場所にあるはず。
ファイルパス:C:\Program Files\IronPython 2.7\Lib\httplib.py

適当なエディタで開き、735行, 1151行 の2箇所修正する。
[修正前]
self.sock = socket.create_connection((self.host,self.port),
self.timeout, self.source_address)

[修正後]
self.sock = socket.create_connection((self.host,self.port),
self.timeout)

(同じ記載が735行目と1151行目にある)

以上。

上記の修正の後、urllib.urlopenを使用したところ、問題なく動いた。
土曜日ちゃんは無駄な犠牲ではなかったのだ・・・。


---
VisualStudio2010 +Ironpythonの日本語ドキュメントがほとんどなくて、困った。
ネット上のブログ記事もまだ旧バージョンの情報が大半で、載せててもインストール手順くらい。

上の問題も偶然、更新日を1年以内のIronpythonのWebサイトを探して、解決方法がみつかっただけ。
ヘボグラマが手出すにはちょっと早かったかな。

Ironpython2.7 は今現在アルファ版だから、この問題は正式版で直ってることでしょう。


IronPythonの世界 (Windows Script Programming) IronPythonの世界 (Windows Script Programming)
荒井 省三

ソフトバンク クリエイティブ
売り上げランキング : 392967

Amazonで詳しく見る

みんなのPython 改訂版 みんなのPython 改訂版
柴田 淳

ソフトバンククリエイティブ
売り上げランキング : 100279

Amazonで詳しく見る

VBA 値が同じ行を結合させる

■VBA 値が同じ行が続いていたら、結合させる
どっかの質問コーナーに書いてあったコードを参考に書いたけど、URLロストしてしまった。
とりあえず、動くと思う。

Sub MargeMethod()
    '値が同じ行が続いていたら、結合させる処理

    Dim MargeCol1 As Integer
    ‘対象はA列
    MargeCol1 = 1
   
    Dim lngRowLst As Long
    Dim lngRowCnt As Long
    Dim lngRowGrp As Long

    '値が入っている最終行数を取得
    lngRowLst = Cells.SpecialCells(xlCellTypeLastCell).Row
   
    '開始行数
    lngRowCnt = 2

    Do

      lngRowGrp = lngRowCnt

      Do While Cells(lngRowGrp, MargeCol1).Value = Cells(lngRowCnt + 1, MargeCol1).Value
         lngRowCnt = lngRowCnt + 1
      Loop

      '警告を表示させない
      Application.DisplayAlerts = False
      '結合
      Range(Cells(lngRowGrp, MargeCol1), Cells(lngRowCnt, MargeCol1)).Merge
      '警告を表示させない設定を元に戻す
      Application.DisplayAlerts = True

      lngRowCnt = lngRowCnt + 1
   
    Loop Until lngRowCnt > lngRowLst

End Sub


世界でいちばん簡単なExcelVBAのe本
世界でいちばん簡単なExcelVBAのe本

VBA タブ区切りのテキストを読み込む

■VBA タブ区切りのテキストを読み込む
大量のタブ区切りのテキストファイルをエクセルに読み込む必要があったので、作成。

やりたかったことは...
・ タブごとのテキストファイルを別セルに挿入する
・ フォルダ内の全てテキストを読み込む
・ 読み込んだテキストごとにページを作成する
・ ページ名はテキストファイルの名前にする

で、できたのがコレ。

Sub tabread()

    Dim line As Long
    Dim buf As String
    Dim tmp As Variant
    Dim NewWorkSheet As Worksheet
    Dim Target As String
    Dim arraycount As Integer

    '対象フォルダをセルから取得
    Target = Range("B1").Value

    Set FS = CreateObject("Scripting.FileSystemObject")
    Set Fol = FS.GetFolder(Target)
    Set Fil = Fol.Files

    '対象フォルダにあるファイル数だけループ
    For Each Fx In Fil

        'ファイルパスを取得
        sFile = Fol

        'ファイル名を取得
        sFile = Fol + "\" + Fx.Name

        '拡張子を除いたファイル名を取得
        sheettmp = Split(Fx.Name, ".")

        'ファイルごとに新規シートを作成
        Set NewWorkSheet = Worksheets.Add()
        NewWorkSheet.Name = sheettmp(0)

        Open sFile For Input As #1

        '2行目のセルから取り込む
        line = 2

        'テキストファイルの終端までループ
        Do Until EOF(1)

            Line Input #1, buf

            'タブ区切りで配列に取得
            tmp = Split(buf, vbTab)

            '配列の要素数を取得
            arraycount = UBound(tmp)

            For counter = 1 To arraycount
                Cells(line, counter) = tmp(counter - 1)
            Next counter

            '次の行へ
            line = line + 1

        Loop
        Close #1

    Next
End Sub

実際は、セルの幅を調整したり、結合したりする機能も実装したけど、汎用的な部分を抽出した。

使った機能メモ。

'書式を整える
Dim lngRowLst As Long

'値が入っている最終行を取得
lngRowLst = Cells.SpecialCells(xlCellTypeLastCell).Row

'セルの幅を設定する
Range(Cells(4, 1), Cells(4, 1)).ColumnWidth = 45
Range(Cells(4, 2), Cells(4, 5)).ColumnWidth = 15

'値が入っている最終行まで罫線を引く
Range(Cells(4, 1), Cells(lngRowLst, 5)).Borders.LineStyle = xlContinuous

'値が入っている最終行まで中央揃えにする(B~Eの範囲)
Range(Cells(2, 2), Cells(lngRowLst, 5)).HorizontalAlignment = xlCenter

'桁区切りを設定する
Range(Cells(4, 2), Cells(lngRowLst, 2)).NumberFormatLocal = "#,###件"
Range(Cells(4, 5), Cells(lngRowLst, 2)).NumberFormatLocal = "#,###件"


なんだかんだで、エクセルVBA便利っすなぁ。


C# ツリービュー 子ノード 全てチェック

■C#メモ ツリービュー
親ノードをチェックしたとき、子ノードを一度にチェックしたい。
親をはずしたら、子もはずれる。

ここにずばり解答があった。
http://bbs.wankuma.com/index.cgi?mode=al2&namber=45248&KLOG=77

ちょっと探すのに手間どったのでメモメモ…

private void treeView1_AfterCheck(object sender, TreeViewEventArgs e) {
    foreach (TreeNode node in e.Node.Nodes) node.Checked = e.Node.Checked;
}

試してないけど、これだと子ノードの子ノードまでは、チェックされないかな。
必要ないから、調べてはいないけど。

===追記
上記のコードはそのまま貼り付けるだけじゃ駄目で、TreeViewのプロパティに設定する必要がある。

1.TreeViewのプロパティで、稲妻マークのタブに移動。
trevt.jpg
2.「AfterCheck」の項目でダブルクリックすると、自動で処理が生成。
3.生成された処理のところに上記のコードのforeachの1行を貼り付ける。以上。



ちなみに以下のようなツリービューを手動で作成して、試したみたところ
親ノードにチェックを入れると、子の子の子ノードまで全てチェックされた。
node.jpg



Python difflibメモ

■Python 差異を抽出
4.4 difflib -- 差異の計算を助ける
http://www.python.jp/doc/2.5/lib/module-difflib.html

使う前に上記のリンク先にある↓を分かった上でじゃないと出力結果が訳分からなくなる。

コード

意味
'- '

'- ' 列は文字列1にのみ存在する

'+ '

'+ ' 列は文字列2にのみ存在する

' ' 列は両方の文字列で同一
'? ' 列は入力文字列のどちらにも存在しない

とりあえず差異が発生している行を抽出したかった。

import difflib

f1 = file('C:\\test\\0.txt').readlines()
f2 = file('C:\\test\\1.txt').readlines()
for i in difflib.unified_diff(f1,f2):
    if(i[0] == "+"):
        print i



差異が発生している行に + を付与して出力してくれるから (- も同様)
文字列の操作で先頭文字だけを取得して、条件分岐。




===追記====
以下のような形で使用した。
これで十分。




import difflib

f1 = file('C:\file1.txt').readlines()
f2 = file('C:\file2.txt').readlines()

linebox = []


for i in difflib.unified_diff(f1,f2):
    if(i[0] == "+"):
        linebox.append(i)

newfilepass = open('C:\memo\\diff_output.txt','w')
for writeline in linebox:
    newfilepass.write(writeline)

newfilepass.close()



---
入門用のが増えてんね。
≪PREVNEXT≫
■スポンサードリンク
■プロフィール

ベタログ

管理人 : ベタログ (Twitterアカウント

思い立ったら、ジャンルを気にせず記事にする。それが自由というものだ。
そんな管理方針。
主に取り扱ってる事:オンラインゲーム(SDGO/Travian/ロードオブナイツ)、プログラミングメモ、ネット小説/書籍の感想/観葉植物など。

■まとめ記事
■カテゴリ
■最新記事
■PICKUP

個人的に押しているモノ


魚里高校ダンジョン部! 藻女神様と行く迷宮甲子園
魚里高校ダンジョン部! 藻女神様と行く迷宮甲子園
■感想記事
これぞ青春エンタメ小説。熱いですよ!

オーバーロード1 不死者の王
オーバーロード1 不死者の王
■感想記事
最強軍団が異世界を蹂躙するファンタジー。Web版も読めますが、凄まじい加筆がされているため、Web版読者も楽しめます。
■お勧め品
■最新コメント
■月別アーカイブ
検索フォーム
リンク
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。