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

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

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

Re[5]: DataGridView 編集中→Enter で・・・・


(過去ログ 30 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■13846 / inTopicNo.1)  DataGridView 編集中→Enter で・・・・
  
□投稿者/ ぽん他 (1回)-(2008/02/05(Tue) 16:53:04)

分類:[C#] 

VS2005 C# 始めたばかりです。宜しくお願いします。

フォームに dataGridView と textBox のコントロールが置いてあります。
dataGridView の あるセルを編集し、Enterキーか、TABキーで、編集を確定し
textBox へフォーカスを移動させる方法が判りません。

普通に keyDown イベントで フォーカスをセットすると、編集中で無い時は
フォーカス移動するのですが、編集中の場合、一度下のセルへ移動後(Enterの場合)、
もう一度 Enterキーを押すことで textBox へフォーカスがあたります。
編集中でも、1度のエンターキーで編集を確定して、 textBoxへフォーカスを移動する
ことはできるのでしょうか?????



引用返信 編集キー/
■13928 / inTopicNo.2)  Re[1]: DataGridView 編集中→Enter で・・・・
□投稿者/ 引っ込んだ(略) (1回)-(2008/02/06(Wed) 18:26:38)
2008/02/07(Thu) 19:06:34 編集(投稿者)
2008/02/06(Wed) 23:39:31 編集(投稿者)
2008/02/06(Wed) 18:31:39 編集(投稿者)
(変更履歴)
 1.顔文字を追加
 2.コメントを追加
 3.↑で追記したコメントを削除(日本語は難しいですね・・・)

引っ込んだ(略)と申します。
 今度はこちらの掲示板から、お答えいたします(^^。  [追記1] 顔文字を追加

[ここから削除]
 [追記2]
 # ↑言外の意味は全くありません。誤解されないでくださいね。
 # こちらでのご質問投稿では、リンクをうっかり張り忘れているようです。
 # http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al2&namber=21426&rev=&no=0
 # 私の1回目の投稿はどぼん!さんの掲示板で、
 # 2回目投稿のチャンスがもしあれば、わんくまさんの掲示板で行うことに最初から決めておりました(←本当の話)。
 [ここまで追記2]
[ここまで削除]

 苦し紛れの方法なのですが(汗
 とりあえず以下のコードで試してみてください。
 ※ 一度ビルドした後、ツールボックスからDataGridViewExをFormにドロップしてください
 ※ コードがVBですがご了承下さい。

Public Class Form1
Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
MyBase.OnLoad(e)
Me.DataGridViewEx1.SelectionMode = DataGridViewSelectionMode.FullRowSelect
End Sub
Private Sub DataGridViewEx1_FocusProposing(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataGridViewEx1.FocusProposing
TextBox1.Focus()
End Sub
End Class

Public Class DataGridViewEx
Inherits DataGridView
Public Event FocusProposing As EventHandler
Protected Overridable Sub OnFocusProposing(ByVal e As EventArgs)
RaiseEvent FocusProposing(Me, e)
End Sub
Dim m_isendedit As Boolean = False
Dim m_prevcell As New Point(-99, -99)
Protected Overrides Sub OnCellEnter(ByVal e As System.Windows.Forms.DataGridViewCellEventArgs)
MyBase.OnCellEnter(e)
If Me.m_isendedit = True Then
' Me.SetSelectedCellCore(e.ColumnIndex, e.RowIndex, False)
' Me.SetSelectedCellCore(Me.m_prevcell.X, Me.m_prevcell.Y, True)
Me.SetSelectedRowCore(e.RowIndex, False)
Me.SetSelectedRowCore(Me.m_prevcell.Y, True)
Me.m_isendedit = False
End If
End Sub
Protected Overrides Sub OnCellEndEdit(ByVal e As System.Windows.Forms.DataGridViewCellEventArgs)
MyBase.OnCellEndEdit(e)
Me.m_isendedit = True
Me.m_prevcell = New Point(e.ColumnIndex, e.RowIndex)
Me.OnFocusProposing(EventArgs.Empty)
End Sub
Protected Overrides Sub OnKeyDown(ByVal e As System.Windows.Forms.KeyEventArgs)
MyBase.OnKeyDown(e)
Select Case e.KeyCode
Case Keys.Return, Keys.Tab
Me.OnFocusProposing(EventArgs.Empty)
e.Handled = True ' ←この行はなくてもOK
End Select
End Sub
End Class

以上です。
引用返信 編集キー/
■14166 / inTopicNo.3)  Re[2]: DataGridView 編集中→Enter で・・・・
□投稿者/ ぽん他 (4回)-(2008/02/12(Tue) 08:45:53)
引っ込んだ(略)さま

ありがとうございます。

 ↓ すみませんでした。
どぼん!のプログラミング道掲示板
http://dobon.net/cgi-bin/vbbbs/cbbs.cgi #21426
マルチポストしてます。

http://dobon.net/vb/dotnet/datagridview/enterkeymoveright.html
 ↑
を参考にちょっとやってみたのですが、
dataGridView1.DataSource = dtable;

でデータが反映されません。Exでないとちゃんと反映されます。
???素人ですみません・苦

#ちょっと出かけることが多くなってきています。
#返信が遅れたらごめんなさい・・・







No13928 (引っ込んだ(略) さん) に返信
> 2008/02/07(Thu) 19:06:34 編集(投稿者)
> 2008/02/06(Wed) 23:39:31 編集(投稿者)
> 2008/02/06(Wed) 18:31:39 編集(投稿者)
> (変更履歴)
>  1.顔文字を追加
>  2.コメントを追加
>  3.↑で追記したコメントを削除(日本語は難しいですね・・・)
>
> 引っ込んだ(略)と申します。
>  今度はこちらの掲示板から、お答えいたします(^^。  [追記1] 顔文字を追加
>
> [ここから削除]
>  [追記2]
>  # ↑言外の意味は全くありません。誤解されないでくださいね。
>  # こちらでのご質問投稿では、リンクをうっかり張り忘れているようです。
>  # http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al2&namber=21426&rev=&no=0
>  # 私の1回目の投稿はどぼん!さんの掲示板で、
>  # 2回目投稿のチャンスがもしあれば、わんくまさんの掲示板で行うことに最初から決めておりました(←本当の話)。
>  [ここまで追記2]
> [ここまで削除]
>
>  苦し紛れの方法なのですが(汗
>  とりあえず以下のコードで試してみてください。
>  ※ 一度ビルドした後、ツールボックスからDataGridViewExをFormにドロップしてください
>  ※ コードがVBですがご了承下さい。
>
> Public Class Form1
> Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
> MyBase.OnLoad(e)
> Me.DataGridViewEx1.SelectionMode = DataGridViewSelectionMode.FullRowSelect
> End Sub
> Private Sub DataGridViewEx1_FocusProposing(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataGridViewEx1.FocusProposing
> TextBox1.Focus()
> End Sub
> End Class
>
> Public Class DataGridViewEx
> Inherits DataGridView
> Public Event FocusProposing As EventHandler
> Protected Overridable Sub OnFocusProposing(ByVal e As EventArgs)
> RaiseEvent FocusProposing(Me, e)
> End Sub
> Dim m_isendedit As Boolean = False
> Dim m_prevcell As New Point(-99, -99)
> Protected Overrides Sub OnCellEnter(ByVal e As System.Windows.Forms.DataGridViewCellEventArgs)
> MyBase.OnCellEnter(e)
> If Me.m_isendedit = True Then
> ' Me.SetSelectedCellCore(e.ColumnIndex, e.RowIndex, False)
> ' Me.SetSelectedCellCore(Me.m_prevcell.X, Me.m_prevcell.Y, True)
> Me.SetSelectedRowCore(e.RowIndex, False)
> Me.SetSelectedRowCore(Me.m_prevcell.Y, True)
> Me.m_isendedit = False
> End If
> End Sub
> Protected Overrides Sub OnCellEndEdit(ByVal e As System.Windows.Forms.DataGridViewCellEventArgs)
> MyBase.OnCellEndEdit(e)
> Me.m_isendedit = True
> Me.m_prevcell = New Point(e.ColumnIndex, e.RowIndex)
> Me.OnFocusProposing(EventArgs.Empty)
> End Sub
> Protected Overrides Sub OnKeyDown(ByVal e As System.Windows.Forms.KeyEventArgs)
> MyBase.OnKeyDown(e)
> Select Case e.KeyCode
> Case Keys.Return, Keys.Tab
> Me.OnFocusProposing(EventArgs.Empty)
> e.Handled = True ' ←この行はなくてもOK
> End Select
> End Sub
> End Class
>
> 以上です。
引用返信 編集キー/
■14205 / inTopicNo.4)  Re[3]: DataGridView 編集中→Enter で・・・・
□投稿者/ 引っ込んだ(略) (6回)-(2008/02/13(Wed) 00:57:53)
引っ込んだ(略)と申します。

 trapemiya さんのコードを参考にさせていただきながら(ありがとうございます。大変勉強になりました)、
   http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al2&namber=21426&rev=&no=0
 私なりに書いてみました。
 派生クラスを一切使わない方式です。
 # 多分ぽん他さんご希望の動作にかなり近づいたと思いますが・・・(汗
 # コードが一部VBみたいになってすみません。

        Point m_cellpoint = new Point(-99, -99);
        private Control m_editingcontrol;

        private void dataGridView1_Enter(object sender, EventArgs e)
        {
            //Console.WriteLine("Enter - " + this.dataGridView1.CurrentCellAddress.ToString());
            if (m_cellpoint.X >= 0 && m_cellpoint.Y >= 0)
                { this.dataGridView1[this.m_cellpoint.X, this.m_cellpoint.Y].Selected = true; }
            //End If
        }
        private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
        {
            //Console.WriteLine("CellEnter - " + this.dataGridView1.CurrentCellAddress.ToString());
            this.m_cellpoint = new Point(e.ColumnIndex, e.RowIndex);
        }
        private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            //Console.WriteLine("CellEndEdit - " + this.dataGridView1.CurrentCellAddress.ToString());
            if (this.m_editingcontrol != null)
                { this.m_editingcontrol.PreviewKeyDown -= new PreviewKeyDownEventHandler(this.m_PreviewKeyDown); }
            //End If
            textBox1.Focus();
        }
        private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Return || e.KeyCode == Keys.Tab)
                { textBox1.Focus(); e.Handled = true; }
            //End If
        }
        private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {
            this.m_editingcontrol = e.Control;
            if (this.m_editingcontrol != null)
                { this.m_editingcontrol.PreviewKeyDown += new PreviewKeyDownEventHandler(this.m_PreviewKeyDown); }
            //End If
            //Console.WriteLine("EditingControlShowing - " + this.dataGridView1.CurrentCellAddress.ToString());
        }
        private void m_PreviewKeyDown(Object sender,PreviewKeyDownEventArgs e) 
        {
            if (e.KeyCode == Keys.Return || e.KeyCode == Keys.Tab)
              { //Console.WriteLine("Return_PreviewKeyDown");
                this.dataGridView1.EndEdit();
                return; }
            //End If
        }
    
以上です。

引用返信 編集キー/
■14451 / inTopicNo.5)  Re[4]: DataGridView 編集中→Enter で・・・・
□投稿者/ ぽん他 (5回)-(2008/02/19(Tue) 07:54:48)
ご返事が遅くなってすみません。

その上、教えて頂いたコードを入れてみたのですが、
this.m_PreviewKeyDown でエラーになりまして、
どう宣言して良いか判らずじまいです(苦)

結局今は、dataGridView1_RowEnter イベントハンドラで、
覚えているrowカウントを-1する感じで対応してます。
(カレントは動かない)

とっても変なのですが、今一度時間を取って取り組みたいと思います。
ありがとうございました。


No14205 (引っ込んだ(略) さん) に返信
> 引っ込んだ(略)と申します。
>
>  trapemiya さんのコードを参考にさせていただきながら(ありがとうございます。大変勉強になりました)、
>    http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al2&namber=21426&rev=&no=0
>  私なりに書いてみました。
>  派生クラスを一切使わない方式です。
>  # 多分ぽん他さんご希望の動作にかなり近づいたと思いますが・・・(汗
>  # コードが一部VBみたいになってすみません。
>
> Point m_cellpoint = new Point(-99, -99);
> private Control m_editingcontrol;
>
> private void dataGridView1_Enter(object sender, EventArgs e)
> {
> //Console.WriteLine("Enter - " + this.dataGridView1.CurrentCellAddress.ToString());
> if (m_cellpoint.X >= 0 && m_cellpoint.Y >= 0)
> { this.dataGridView1[this.m_cellpoint.X, this.m_cellpoint.Y].Selected = true; }
> //End If
> }
> private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
> {
> //Console.WriteLine("CellEnter - " + this.dataGridView1.CurrentCellAddress.ToString());
> this.m_cellpoint = new Point(e.ColumnIndex, e.RowIndex);
> }
> private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
> {
> //Console.WriteLine("CellEndEdit - " + this.dataGridView1.CurrentCellAddress.ToString());
> if (this.m_editingcontrol != null)
> { this.m_editingcontrol.PreviewKeyDown -= new PreviewKeyDownEventHandler(this.m_PreviewKeyDown); }
> //End If
> textBox1.Focus();
> }
> private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
> {
> if (e.KeyCode == Keys.Return || e.KeyCode == Keys.Tab)
> { textBox1.Focus(); e.Handled = true; }
> //End If
> }
> private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
> {
> this.m_editingcontrol = e.Control;
> if (this.m_editingcontrol != null)
> { this.m_editingcontrol.PreviewKeyDown += new PreviewKeyDownEventHandler(this.m_PreviewKeyDown); }
> //End If
> //Console.WriteLine("EditingControlShowing - " + this.dataGridView1.CurrentCellAddress.ToString());
> }
> private void m_PreviewKeyDown(Object sender,PreviewKeyDownEventArgs e)
> {
> if (e.KeyCode == Keys.Return || e.KeyCode == Keys.Tab)
> { //Console.WriteLine("Return_PreviewKeyDown");
> this.dataGridView1.EndEdit();
> return; }
> //End If
> }
>
> 以上です。
解決済み
引用返信 編集キー/
■14522 / inTopicNo.6)  Re[5]: DataGridView 編集中→Enter で・・・・
□投稿者/ 引っ込んだ(略) (7回)-(2008/02/20(Wed) 21:12:11)
お久しぶりです。引っ込んだ(略)と申します。

念のための補足ですが、
(C#なので分かりにくい点がありました)
  Form上にDataGridViewを配置し、
  private void m_PreviewKeyDown以外のイベントハンドラをデザイナ上で登録。

これで、私の環境(VisualC#2005ExpressEdition)で動作します。
  ※private void m_PreviewKeyDownは私のコードの中でイベントハンドラの登録と削除を手動で行っています。

以上です。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -