最新情報(固定記事)

※※※※※※※※※※※※※※※※※※※※※※
計画中!
★ルビーのスパイ作戦
カードバトルxアドベンチャー
製作の最新情報はCi-enにて!

発売中!
えびげん、ターニャのラインディフェンス(NEW!)
エヴァいじり
弄ってイかせよう。シミュレーションゲーム!
・キャッスルえびる登録情報ページ
・スーサイダー登録情報ページ
・スペルマスター登録情報
・パツィーノの幸せの鳥登録情報
・ミナーヴァ登録情報

ダンジョンオブエロチックマスター発売中!(プログラム担当)
------------------------------------------------------------
★更新情報(2018/11/01)

※※※※※※※※※※※※※※※※※※※※※※

2014年3月23日日曜日

DataGridView

.NET Frameworkでちょっと難航したのでメモ。
DataGridViewは本当やっかい


■プログラミング

■.NET Framework

リサイズ関係は幾つも似たような物が有り、互いに干渉していてかなり意味不明。

○列幅を変更可能にする

ここ参照

AllowUserToResizeColumn=true
AutoSizeRowsMode=DataGridViewAutoSizeRowsMode.Fill
AutoSizeRowsModeをAllCellsにするとなぜか列幅をユーザが変更できなくなる。

ちなみにFillの場合列幅の自動調整が効かなくなるので…
dataGridView1.AutoResizeColumn(i, DataGridViewAutoSizeColumnMode.AllCells);
とやって部分的に自動調整可能(幅がでかすぎるときなど)。

さらに、Fillだと横スクロールが出ない。
調べると、カラムのFrozenをfalseにする…
dataGridView1.Columns[i].Frozen = false;
とあったが、やはり出なかった。
この場合、カラムの幅をウィンドウ外までひっぱれない設定できない。


○ステータスバー

考え無しに下記のように配置すると…
・SplitContainer.Dock=Fill
・StatusStrip.Dock=Bottom
SplitContainerの下端がStatusStrip=ステータスバーの下に入り込んでしまう。
(横スクロールバーが隠れる)

で、対処策は1枚パネルを用意して、その上にSplitContainerを置けば良い。
仕様だろうけど、動作としては変。


○DataGridViewのクリア、登録

リストボックスと思ってやろうとすると上手く動かない。

・初期化(クリア):DataSourceを新しく用意した方が早い。カラムもその都度入れ直す。…
DataTable data = new DataTable();
data.Columns.Add("ID", Type.GetType("System.String"));
dataGridView1.dataSource = data;

こんな感じで。

・DataSourceとは?:テーブル=表の実体データ。Databaseを指定したりする。表示目的だけなら、DataTableをnewして使えば良い。

・情報の追加:
DataRow row = data.NewRow();
object[] obj = getRow();
row.ItemArray =  obj;
data.Rows.Add( row );

--
string[] getRow () {
 return {"データ","",""};
}

○チェックボックスを入れる

リストボックスのやり方とは違う模様。
カラム追加時に…
data.Columns.Add( "カラム名", typeof(bool));
とやっておき、データ挿入時に…
row.ItemArray[i]=true;
とかやればOK。

○一部の列だけ編集可能に。

全体をReadOnlyにすることは出来るが、一部だけ変えたい場合の手順。
まずDataGridViewはReadOnly=falseにしておく。
で、DataTable作成時に…
data.Columns[i].ReadOnly=true/false
とすればOK。
ちなみに、DataGridViewをReadOnly=falseにすると、DataTableが書き込み可能だろうと無効化される。分かりづらい。

○読み取り専用の列を編集する

例えプログラムからであろうと、ReadOnlyの列を弄ろうとすると例外が発生する。
なので、一旦ReadOnlyを外す。
具体的には…
DataTable dataTable = dataGridView1.DataSource as DataTable;
dataTable.Columns[(int)ColumnType.FILENAME].ReadOnly = false;
dataTable.Rows[nRowIndex][(int)ColumnType.FILENAME] = Path.GetFileName(strNewPath);
dataTable.Columns[(int)ColumnType.FILENAME].ReadOnly = true;
dataGridView1.UpdateCellValue( (int)ColumnType.FILENAME, nRowIndex );
…といった感じ。
as はキャストみたいなもので、…
DataTable dataTable = (DataTable)dataGridView1.DataSource;
…でも良い。

○アプリケーションのパスを得たい

strCurDirPath = System.Reflection.Assembly.GetExecutingAssembly().Location;
はい。

0 件のコメント:

コメントを投稿