質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

3回答

7460閲覧

C# WinformのDataGridViewで、FrozenをFalseにしても固定が解除出来ない

sheephuman

総合スコア112

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2018/01/03 09:52

編集2018/01/03 12:14

マウスホイールイベント使用時、カーソル移動よりも内部のスクロールが優先される仕様のため、それを抑制しようと考えました。
列を3つ追加済みのものとします。

 ```
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp9
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
dataGridView1.MouseWheel += new MouseEventHandler(dataGridView1_MouseWheel);

} private void dataGridView1_MouseWheel(object sender, MouseEventArgs e) { try { dataGridView1.MultiSelect = false; int wheel = e.Delta / 120;

        //マウスホイール時の上下

int CurrentRow = dataGridView1.CurrentCell.RowIndex - wheel; int CurrentCell = dataGridView1.CurrentCell.ColumnIndex;

       //マウスホイール時に選択行を1ずつ変更
dataGridView1.Rows[CurrentRow].Cells[CurrentCell].Selected = true;

//現在の選択行が10以上のとき固定を解除 if (10 < CurrentRow) { dataGridView1.Rows[10].Frozen = false; dataGridView1.FirstDisplayedScrollingColumnIndex = 10; //10行目から表示 } } catch (Exception ex) { // MessageBox.Show(ex.Message, dataGridView1.RowCount.ToString()); Console.WriteLine(ex); } } private void Form1_Load(object sender, EventArgs e) { int CountVal = 0; for (int i=0; i < 30; i++) { dataGridView1.Rows.Add(); for (int C = 0; C < 3; C++) { dataGridView1.Rows[i].Cells[C].Value = CountVal; CountVal++; } } dataGridView1.Rows[10].Frozen = true; } }

}

実行結果  ![実行結果](f21a387b8e1acdd1300818e87e384e9f.png)      通常であれば、このようにして固定が解除された状態では、スクロールも初期状態に戻るはずですが、固定された状態のままです。どのようにすれば解除できるのか教えてください。 ** 試したこと**  [マウスホイール動作を無効化したい](https://teratail.com/questions/72857) を参考にしましたが、スクロール動作は無効化出来たものの、既存のマウスホイールイベントが上書きされたために、マウスホイール時のカーソル移動が無効化されました。 更に試したこと ```ここに言語を入力 protected override void OnMouseWheel(MouseEventArgs e) { HandledMouseEventArgs wEventArgs = e as HandledMouseEventArgs; wEventArgs.Handled = true; int Wheel = e.Delta / 120; CurrentCell = CurrentRow.Cells[Wheel]; }

 try Catchで囲んでも、僅かにカーソルが動いただけで配列の境界外errorになります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2018/01/03 12:23

Wheel の値を確かめてください。Delta はどれだけホイールが回ったかというものなので添え字には向きません。
sheephuman

2018/01/03 12:26

常に1か-1になるように、自分の環境で調整してます。
Zuishin

2018/01/03 12:28

-1 は範囲外です。
guest

回答3

0

現在はこのようなコードにしています。

/// <summary> /// dataGridviewのスクロール抑止 /// </summary> /// <param name="e"></param> protected override void OnMouseWheel(MouseEventArgs e) { int Wheel = e.Delta / 120; try { HandledMouseEventArgs wEventArgs = e as HandledMouseEventArgs; wEventArgs.Handled = true; //例外回避のための条件指定 if (CurrentCell.RowIndex - Wheel < RowCount && CurrentCell.RowIndex - Wheel > -1) { CurrentCell = Rows[CurrentCell.RowIndex - Wheel].Cells[CurrentCell.ColumnIndex]; } } catch { //例外は出ない } } }

投稿2018/08/05 13:13

sheephuman

総合スコア112

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

DataGridView を継承しても良ければ OnMouseWheel で e.Handled を true にすることでホイールのデフォルト動作を無効にできます。
そこで同時にカーソル移動すればいいと思います。

投稿2018/01/03 11:36

Zuishin

総合スコア28656

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sheephuman

2018/01/03 11:39

オーバーライドは試したんですが、カーソル移動の方法が分かりませんでした。よろしければ、コード例の記載をお願いします。
Zuishin

2018/01/03 11:40

CurrentRow です。
sheephuman

2018/01/03 11:49

すみません。OverrideしたOnMouseWheelメソッドで入れると「読み取り専用であるため、割り当てることが出来ません」と表示されます。 CurrentRow、CurrentCellで同様の結果です。
sheephuman

2018/01/03 12:37

ちょっと大変でしたが実装出来ました。ありがとうございました。
guest

0

OnMouseWheelをOverRideしたときの実装

 ```ここに言語を入力
{
protected override void OnMouseWheel(MouseEventArgs e)
{
try
{
HandledMouseEventArgs wEventArgs = e as HandledMouseEventArgs;
wEventArgs.Handled = true;

int Wheel = e.Delta / 120; CurrentCell = Rows[CurrentCell.RowIndex -Wheel].Cells[0];

catch
{ }
}

 とてもスムーズに動きました。助かりました。  随分と手間どってしまいました。  追記 スクロールイベントで調整したら意外と上手く行きました。 ```ここに言語を入力 private void dataGridView1_Scroll(object sender, ScrollEventArgs e) { int CurrentRow = dataGridView1.CurrentCell.RowIndex; Text = CurrentRow.ToString(); if (dataGridView1.FirstDisplayedScrollingRowIndex < 10) { if (CurrentRow < 10) { dataGridView1.FirstDisplayedScrollingRowIndex = 0; } } else if(dataGridView1.FirstDisplayedScrollingRowIndex >10) { if(CurrentRow > 10) { dataGridView1.FirstDisplayedScrollingRowIndex = CurrentRow-3; } } }

結局、このような感じで調整しました。もっと良い方法があればお願いします。挙動が微妙です。

if (3 < CurrentRow && wheel == -1) //ホイール下移動時 { dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView1.CurrentCell.RowIndex-3 ;    }   else if(wheel == 1)  //ホイール上移動時     { dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView1.CurrentCell.RowIndex-6;    }

投稿2018/01/03 11:03

編集2018/01/03 12:43
sheephuman

総合スコア112

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sheephuman

2018/01/03 11:40

後ほど自己解決にしたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問