Visual Studio 2010でハマったこと

中々解決策が出なかったので。

 

あくまでメモ程度なので試すときは自己責任でお願いします

 

Q.intellisenseが動かない、入力候補が出ない場合

A.Service Packが適用されていない場合は適用する。適用済の場合はユーザデータをリセットするか、再インストールをする。

参考:Autocomplete intellisense not working in Visual Studio 2010 Ultimate RC

 

Q.System.Windows.Baml2006.TypeConverterMarkupExtensionがVS起動時に出る

A.正常にインストールがされていない状態です。

直し方は

regedit

Visual Studio 2010やVisual Studio 2010 Service Packを検索して手当たり次第にフォルダごと削除。

Program FilesにあるVisual Studio関連のものを全て削除

再インストール。Service Packなどのモジュールはインストールしない。

Visual Studio単体で起動ができたら、各種追加モジュールをインストール

最後にServicePackをインストール

 

これで数時間ぐらいハマりましたが、だいたいこれで解決できるはずです。

TypeConverterMarkupExtension関連のエラーはほとんどがプロジェクトからbuildしたもので起きるんですけどね。

たまにこういうIDE自体が壊れる時に困ります(^^;)

 

あと、registry関連は必ずバックアップを取っておいた方がいいんじゃないかなと。

C:\Windows\system32\config以下に一通りあるので直接HDDにコピー、セーフモードなどで復旧できます。

 

Q.Office.Interop~がない!

A.OfficeToolsを管理者権限で実行していない、またはOfficeのPIAをインストールしていない状態です。

インストール時にVisual Studio Tools for Officeフォルダがあれば削除しましょう。

すでにインストールがされている扱いの場合、一度レジストリから削除する必要があります。

 

もし、他のコンピュータにもOffice toolsが入っている場合はフォルダごとコピーするのも吉です。

私の場合は予備PCから持ってきました。

 

C#でフォーム間の値の受け渡しをする

頻出らしいので簡単にまとめ

 

hogeプロジェクト内のForm1からForm2に値を渡す場合

namespace hoge

{

    public partial class Form1 : Form

    {

        public Form1

        {

                 InitializeComponent();

        }

        public button1_Click(object sender, EventArgs e)

        {

                 Form2 piyo = new Form2();

                 piyo.ShowDialog(this, textBox1, textBox2);

        }

    }

}

 

namespace hoge

{

    public partial class Form2 : Form

    {

        private int title;

        private String name;

        public Form2()

        {

                public void ShowDialog(IWin32Window owner, int title, String name)
                {

                    title=title;

                    name=name;

                    base.ShowDialog();

                }

        }

    }

}

 

いわゆるbuttonを押したらform2が出てくるあれです。

 

ただし、Form2のShowDialog()メソッドは違うみたいですね。

 

 

実は、Form2のShowDialog()メソッドは、もともと用意されているShowDialog()メソッドのオーバーライドをやってます。

つまり、オーバーライド元がメソッドであれば、だいたいのオーバーライドは可能だったりします。

 

ちなみにオーバーライドは簡単に言い表すと下克上のようなもので、偉いのがデフォルトのクラス、下っ端は各form内のクラスと考えると分かりやすい。

デフォルトのクラスをform内のクラスで処理を上書きしてしまおう、そんな感じ。

 

今回のsampleではForm2のShowDialog()メソッドが実質的なセッターとなって値をセット、その後は各々でgetしてくださいなという内容でした。

 

他にもインスタンスなどでごちゃごちゃとやっているところは多いのですが、私としてはこの方法が簡単でベストじゃないかなーと思ってます。

MySQLで連番を振る

必要になったので適当にメモ。

 

SQLで連番を振る時にOracleではROW_NUMBERという関数を使うことができます。

MySQLの場合は使えないんですよね、コレ。

 

そこでユーザ構文変数を利用します。

 

●書式

(CASE

WHEN @num=NULL THEN @num:=0

WHEN @num IS NULL THEN @num:=0

ELSE @num:=@num+1) AS count

 

実はSQLならこれだけで連番を振ることができます。

ただし、際限なくカウントしてしまうので、必ずWHERE句で上限を決めておきましょう。

 

他にも

SELECT (@num:=@num+1) AS count FROM (SELECT @num:=0) AS dummy

というものがあります。

ただし、この場合は参照テーブルが固定されていると使えません。(フレームワーク使用時など)

 

また、UNIONを使うとこんなSQL

(SELECT @num:=1 AS count)

UNION

(SELECT @num:=@num+1 AS count,hoge FROM piyo)

 

ちなみに、count(*)はuniqueのカラムでなければ、連番として使えません。