DataGridViewは本当やっかい
■プログラミング
■.NET Framework
リサイズ関係は幾つも似たような物が有り、互いに干渉していてかなり意味不明。○列幅を変更可能にする
ここ参照AllowUserToResizeColumn=trueAutoSizeRowsModeをAllCellsにするとなぜか列幅をユーザが変更できなくなる。
AutoSizeRowsMode=DataGridViewAutoSizeRowsMode.Fill
ちなみにFillの場合列幅の自動調整が効かなくなるので…
dataGridView1.AutoResizeColumn(i, DataGridViewAutoSizeColumnMode.AllCells);とやって部分的に自動調整可能(幅がでかすぎるときなど)。
さらに、Fillだと横スクロールが出ない。
調べると、カラムのFrozenをfalseにする…
dataGridView1.Columns[i].Frozen = false;とあったが、やはり出なかった。
この場合、カラムの幅をウィンドウ外までひっぱれない設定できない。
○ステータスバー
考え無しに下記のように配置すると…・SplitContainer.Dock=FillSplitContainerの下端がStatusStrip=ステータスバーの下に入り込んでしまう。
・StatusStrip.Dock=Bottom
(横スクロールバーが隠れる)
で、対処策は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 件のコメント:
コメントを投稿