C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

DataGridViewのセル編集開始時に左端にスクロール /saku (24/01/30(Tue) 18:25) #102908
Re[1]: DataGridViewのセル編集開始時に左端にスクロール /kiku (24/01/31(Wed) 08:51) #102909
Re[1]: DataGridViewのセル編集開始時に左端にスクロール /WebSurfer (24/01/31(Wed) 09:52) #102910
Re[1]: DataGridViewのセル編集開始時に左端にスクロール /とくま (24/01/31(Wed) 10:08) #102911
Re[1]: DataGridViewのセル編集開始時に左端にスクロール /魔界の仮面弁士 (24/01/31(Wed) 11:04) #102913
  └ Re[2]: DataGridViewのセル編集開始時に左端にスクロール /saku (24/01/31(Wed) 16:52) #102916 解決済み


親記事 / ▼[ 102909 ] ▼[ 102910 ] ▼[ 102911 ] ▼[ 102913 ]
■102908 / 親階層)  DataGridViewのセル編集開始時に左端にスクロール
□投稿者/ saku (1回)-(2024/01/30(Tue) 18:25:04)

分類:[.NET 全般] 

皆さまのお知恵を拝借できないでしょうか。

C#でWindowsフォーム上にDataGridViewを追加してリストの表示・編集を行っています。

50列(項目)ほどあるため、スクロールして対象セルの編集をおこなう仕組みなのですが、
右端で完全に表示されていないセル(例:1セルが幅100であった場合、幅50分しか見えていない状態)をクリックして
編集しようとすると、スクロールが左端に勝手に移動してしまいます。

ググっているのですが「スクロールしないようにする」または、「編集するセルを全て見えるようにちょっぴり移動(完全に表示されていない場合のみ)」で探しているのですがいい対応方法が見つかりません。

private void dgv_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
var dgv = (BaseDataGridView)sender;
dgv.FirstDisplayedCell = dgv[e.ColumnIndex, e.RowIndex];
}

こんな事もしてみましたが、上手くいきませんでした。
何かよい知恵はないでしょうか。


開発環境:VisualStudio2022, C#, .NET Framework 4.8


[ □ Tree ] 返信 編集キー/

▲[ 102908 ] / 返信無し
■102909 / 1階層)  Re[1]: DataGridViewのセル編集開始時に左端にスクロール
□投稿者/ kiku (406回)-(2024/01/31(Wed) 08:51:35)
No102908 (saku さん) に返信
> 皆さまのお知恵を拝借できないでしょうか。
>
> C#でWindowsフォーム上にDataGridViewを追加してリストの表示・編集を行っています。
>
> 50列(項目)ほどあるため、スクロールして対象セルの編集をおこなう仕組みなのですが、
> 右端で完全に表示されていないセル(例:1セルが幅100であった場合、幅50分しか見えていない状態)をクリックして
> 編集しようとすると、スクロールが左端に勝手に移動してしまいます。
>
> ググっているのですが「スクロールしないようにする」または、「編集するセルを全て見えるようにちょっぴり移動(完全に表示されていない場合のみ)」で探しているのですがいい対応方法が見つかりません。
>
> private void dgv_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
> {
> var dgv = (BaseDataGridView)sender;
> dgv.FirstDisplayedCell = dgv[e.ColumnIndex, e.RowIndex];
> }
>
> こんな事もしてみましたが、上手くいきませんでした。
> 何かよい知恵はないでしょうか。
>
>
> 開発環境:VisualStudio2022, C#, .NET Framework 4.8

下記のように列幅を自動的に調整する設定にして、
常に完全に表示されるようにしてはどうでしょうか?
https://dobon.net/vb/dotnet/datagridview/autosizecolumn.html
[ 親 102908 / □ Tree ] 返信 編集キー/

▲[ 102908 ] / 返信無し
■102910 / 1階層)  Re[1]: DataGridViewのセル編集開始時に左端にスクロール
□投稿者/ WebSurfer (2884回)-(2024/01/31(Wed) 09:52:07)
No102908 (saku さん) に返信

> 右端で完全に表示されていないセル(例:1セルが幅100であった場合、幅50分しか見えていない状態)
> をクリックして編集しようとすると、スクロールが左端に勝手に移動してしまいます。

再現できないのですが、どうやってアプリを作ったのでしょうか? 

自分の環境で、以下の記事のようにデザイン画面でデータソースを form にドラッグ&ドロップして
コードを自動生成したアプリでは、そのような操作をしてもスクロール位置は変わりません。

新しいデータ ソースの追加
https://learn.microsoft.com/ja-jp/visualstudio/data-tools/add-new-data-sources?view=vs-2022
[ 親 102908 / □ Tree ] 返信 編集キー/

▲[ 102908 ] / 返信無し
■102911 / 1階層)  Re[1]: DataGridViewのセル編集開始時に左端にスクロール
□投稿者/ とくま (2回)-(2024/01/31(Wed) 10:08:22)
2024/01/31(Wed) 10:16:33 編集(投稿者)

No102908 (saku さん) に返信
最初の質問の内容が、FirstDisplayedCell を設定すること前提の現象を勘違いしていて、
セル幅とかセルの一部だけ表示されてるとかは全然関係なく
FirstDisplayedCell で設定したら最初の表示セルになる(=必要以上にスクロールされる)
という動きについて言ってないかなぁ?と思います。

何もプログラムしなければ、(マウスクリックだと)スクロール自体全くしないのではないかと思います。
新規プロジェクトで、デフォルト設定のdataGridView1でも現象が再現するか確認してください。

キーボード移動(Tabキーや方向キー)だと最小のスクロールで移動したセルが全表示されるので、
SendKeysでキーストローク送ってやれば、それっぽくできなくは無いけど、あんまり良い
プログラムは思い浮かばないなぁ。

[ 親 102908 / □ Tree ] 返信 編集キー/

▲[ 102908 ] / ▼[ 102916 ]
■102913 / 1階層)  Re[1]: DataGridViewのセル編集開始時に左端にスクロール
□投稿者/ 魔界の仮面弁士 (3747回)-(2024/01/31(Wed) 11:04:28)
No102908 (saku さん) に返信
> var dgv = (BaseDataGridView)sender;

BaseDataGridView というのが何者なのか分かりませんが、
System.Windows.Forms.DataGridView 継承の物でしょうか。


> 右端で完全に表示されていないセル(例:1セルが幅100であった場合、幅50分しか見えていない状態)をクリックして
> 編集しようとすると、スクロールが左端に勝手に移動してしまいます。
表示しきれていないセルを編集しようとすると、
該当セルよりも左側にある列のいずれかが FirstDisplayedScrollingColumnIndex になりますね。
左列の幅が広い場合は、自列が左端にスクロールすることもありますが、
いずれにせよ、列幅単位でのスクロールになってしまいますね。


> 「スクロールしないようにする」または、「編集するセルを全て見えるようにちょっぴり移動(完全に表示されていない場合のみ)」で探しているのですが

以前 Hongliang さんが紹介されていた方法では、ピクセル単位での水平スクロールに
HorizontalScrollingOffset プロパティを利用されていました。

ということで、スクロール後に元の位置に戻してしまうとか。
ちょっとちらつくかもしれませんが。

private int horizontalScrollingOffset = 0;
private void dgv_CurrentCellChanged(object sender, EventArgs e)
{
  horizontalScrollingOffset = ((DataGridView)sender).HorizontalScrollingOffset;
}
private void dgv_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
  ((DataGridView)sender).HorizontalScrollingOffset = horizontalScrollingOffset;
}
[ 親 102908 / □ Tree ] 返信 編集キー/

▲[ 102913 ] / 返信無し
■102916 / 2階層)  Re[2]: DataGridViewのセル編集開始時に左端にスクロール
□投稿者/ saku (3回)-(2024/01/31(Wed) 16:52:15)
皆さま、色々なご意見ありがとうございました。
あれから色々と調べていましたところ、スクロールした最後の位置を覚えておき、Scrollイベントでスクロール位置を
設定し直して対応していた方のQ&Aを見つけました。

>kiku様

 今回いただいたリンクは確認させていただきました。
 ありがとうございました。

>WebSurfer様

 継承しているDataGridViewを利用しているのですがこちらが少なからず影響があったのかもしれません。
 後でスクロール位置を戻す記事を見つけましたので、そちらで対応してみることにしました。

>とくま様

 全くもってその通りです。継承したものを使用していたので何らかのイタズラ動作があったのかもしれません。
 先にディフォルトで確認すべきでした。

>魔界の仮面弁士様
 はい、BaseDataGridViewはSystem.Windows.Forms.DataGridViewを継承したモノになります。
 表示色の制御で継承したモノが用意されていました。
 どのイベントで行うのが最も最良かは引き続き確認していきたいと思いますが、スクロール後に位置を戻すのが
 一番影響が低のように感じています。(継承したDataGridViewはいたるところで使用されているため)


<結論>
結果として、滅多に起こる作業・動作ではない、という観点から魔界の仮面弁士様のおっしゃる通り、
スクロール後に元の位置に戻すことにしました。(はい、この形で対応できました。)

皆さま、ご意見ありがとうございました。
感謝します。
解決済み
[ 親 102908 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -