ミスチルの大名曲の数々が配信決定!! 31日間無料!!【PR】

If DataGridView1.CurrentRow.IsNewRow = False Then
'処理を記述
End If

というコードを書いているのですが、
新規行を選択しているにもかかわらず、IsNewRowプロパティがFalseとなってしまいます。
原因として考えられる事がありましたら、ご教授願います。

A 回答 (2件)

No.1です。


状況としては、Button1_Clickの前に何らかのイベントでCurrentCell.RowIndexが-1されていると思うので、DataGridView1の他のイベントで書き換えていませんか?
例えば DataGridView1_LostFocusなどで。
またはDataGridView1_CellLeaveでセルがフォーカスを失った所にブレークポイントを入れて、トレースしてみてはどうでしょうか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

記載していただいた通り、DataGridViewから呼び出されるイベントに全てブレークポイントを置いてみましたが、特に何か影響を及ぼしている箇所は見つけられず。。
選択行を削除したい機能でしたので、
IsNewRowプロパティはあきらめて、
ClickイベントやKeyPressイベントが押された時に選択行を保存して、削除ボタンを押した時に、選択されていた行がMaxRows-1の値かどうかを調べて新規行かどうかを判断することにしました。

ご回答、ありがとうございました

お礼日時:2009/06/04 15:08

>If DataGridView1.CurrentRow.IsNewRow = False Then


>'処理を記述
>End If
で、
>新規行を選択しているにもかかわらず、IsNewRowプロパティがFalseとなってしまいます。
と言う事は、新規行を選択していても「'処理を記述」の処理をしてしまうという事でしょうか?
前後が分からないのですが、もしかしたら予期しないイベントでIsNewRow=Faldeの状態でそこを通ってしまうのかもしれないので、If行にブレークポイントを設定するか、
If DataGridView1.CurrentRow.IsNewRow = False Then
Debug.Print("IsNewRow = False")
'処理を記述
Else
Debug.Print("IsNewRow = True")
End If
とかにして、そこをどのように通過したかを調べてみてはどうでしょうか?
1度はTrueで通って、その後Falseで再び通過するような事は無いでしょうか?

この回答への補足

回答ありがとうございます。

>と言う事は、新規行を選択していても「'処理を記述」の処理をしてしまうという事でしょうか?
はい、その通りです。

補足しますと、
DataGridViewの新規行を選択した状態で、
コマンドボタンクリックのイベントを発生させます。

すると、新規行を選択しているにもかかわらず、IsNewRowがFalseとなっています。
また、CurrentCell.RowIndexが「新規行-1」の値を出しています。
(本来の新規行のRowIndexが5ならば、4が返ってきます)

以下のコードのように、選択した行をDataGridView上から削除する処理を記述しているのですが、新規行を選択していた場合、新規行の前の行が削除されてしまいます。
Private Sub btnDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDelete.Click

If DataGridView1.CurrentRow.IsNewRow = False Then
DataGridView1.Rows.RemoveAt(DataGridView1.CurrentCell.RowIndex)
End If

End Sub

ボタンクリックイベントが実行された直後から1行ずつ実行して試してみましたが、IsNewRowは最初からFalseとなっています。

補足日時:2009/05/28 19:41
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QDataGridViewの特定列に入力されている重複チェックをしたい

VisualBasic2005です。
例えばDataGridViewの3列目にコードが入力されるとします。
その列のコードには重複入力をさせたくないのです。

重複チェックをするのは、そのセルの入力が確定したときでも、
特定のボタンが押されたときでもかまわないので、
チェックする方法はないでしょうか?

よろしくお願いいたします。

Aベストアンサー

そのDataGridViewはDataTableをバインドしてますか?
もしそうなら、DataTableの方で重複をさせたくない列を主キーに設定すれば、重複値を入力したときエラーがでるようになります。
主キーの設定の仕方は例えば
'dtはDataTable
dt.PrimaryKey = New DataColumn() {dt.Columns(2)}

QDatagridViewの値確定

VB2005です。
DataGridViewを私用しています。
EditModeはEditOnEnterです。
特定のセルの値を変更し、カーソルがその列から移動していない状態で、
Buttonコントロールをクリックすると、ボタンクリック時のイベントの前に、
そのセルのCellValueChangedイベントが発生します。
が、同じ要にセルの値を変更し、カーソルがその列から移動していない状態で、
HScrollBarコントロールをクリックすと、CellValueChangedイベントが発生しません。
そうすると、変更した値が反映されず、前の値で処理が進んでしまいます。
HScrollBarコントロールをクリックしたときも、DataGridViewの値が
確定される方法はないでしょうか。

よろしくお願いいたします。

Aベストアンサー

CurrentCellDirtyStateChangedイベント内で、CommitEditを呼ぶとか・・・

Private Sub DataGridView1_CurrentCellDirtyStateChanged(ByVal sender...
  If Me.DataGridView1.IsCurrentCellDirty Then
    Me.DataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit)
  End If
End Sub
(注意!表示の関係上、半角スペースは全角スペースになっています)

QDataGridViewで指定したセルの値を取得

こんにちは。

VB2008のDataGridViewで指定したセルの値を取得をする方法がわかりません。
どなたか教えてください。

Aベストアンサー

こんばんは.

 Dim Data As String
 Data = Me.DataGridView(0, 2).Value
 MsgBox(Data)

みたいな感じで取れないですかね???

QDataGridViewでコードで値を入力したい

VB2005のDataGridViewですが、行と列を指定して
そのセルに値を入力したいと思いますが、どのプロ
パティに行番号・列番号を入れればいいのでしょうか?

Aベストアンサー

VB2005のDataGridView.rows(1).cells(2).value=3

QDataGridViewで入力チェック後、フォーカスをあてたい

お世話になります。
現在VB2005で開発中なのですが、DataGridViewの処理で躓いております。

DataGridViewには「氏名」「住所」「生年月日」を入力できるようにしており、全ての項目において入力必須としています。
よって、どれか一つでも入力がなかった場合はエラーメッセージを表示させ、メッセージ表示後に該当項目のセルにフォーカスをあてたいと考え、ロジックを組んでおります。

仮に「氏名」が空白で、次の行の任意セルをクリックした場合、RowValidatedイベントで各セルに対し入力チェックを行い、メッセージを表示させた後にCurrentCellを空白だったCellにし、さらにEditModeで編集可能状態にすればいいと考えていたのですが、結果は最後にクリックした任意セルにフォーカスが移ってしまいます。

入力チェックを発生させるイベントに問題があるのか、カレントセルにフォーカスを当てる処理で問題があるのかで悩んでいる状態です。

どなたか心当たりがあれば教授願いたいです。
よろしくお願いいたします。

Aベストアンサー

>これはフォーカスを当てずに、メッセージで対処する方法と考えてよろしいでしょうか?
他のセルに移動しようとした時(フォーカスを失った時)にチェックをしてます。
不正ならメッセージを出してフォーカスの移動をキャンセルしてます。

>どれか一つでも入力がなかった場合はエラーメッセージを表示させ、メッセージ表示後に該当項目のセルにフォーカスをあてたいと考え、ロジックを組んでおります。

と言う事だったので、行ではなく1セル単位で、
CellValidating:セルが入力フォーカスを失い、内容の検証が有効になった場合に発生します。
でチェックをして、今回はどのセルでも空白だったらe.cancel=trueでフォーカスを戻しています。
「エラーメッセージを表示させ」とあるので、エラーメッセージを出してます。
Select Case e.ColumnIndex
Case 0
Case 1
Case 2
End Select
でもよかったんですが、メッセージは列見出しを使っています。

>これはフォーカスを当てずに、メッセージで対処する方法と考えてよろしいでしょうか?
他のセルに移動しようとした時(フォーカスを失った時)にチェックをしてます。
不正ならメッセージを出してフォーカスの移動をキャンセルしてます。

>どれか一つでも入力がなかった場合はエラーメッセージを表示させ、メッセージ表示後に該当項目のセルにフォーカスをあてたいと考え、ロジックを組んでおります。

と言う事だったので、行ではなく1セル単位で、
CellValidating:セルが入力フォーカスを失い、内容の...続きを読む

QDataGridViewへの新規行追加について(VB2008)

VB2008ExpressEdition,DBはAccess2003の環境にて小規模な業務アプリの開発を行っている者です。
VBを使用してまだ2週間足らずですので、初歩的な質問かもしれませんが、よろしくお願いします。

テーブルの内容を明細表示し、登録ボタンを押すとDB更新を
行うような簡単なマスタメンテナンス画面があるとします。

明細表示のため、フォーム上にDataGridViewを作成、
DataSouceプロパティを指定し、型付きDataSetをBindさせました。
AllowUserToAddRowsプロパティはTrueとし、DataGridView上への
新規行追加も可能としてあります。

このとき、プログラムを動作させ複数行新規追加を行うと、
2行目の行追加のタイミングで、
「データの登録時にエラーが発生しました。
列「〇〇」は一意であるように制約されています。
値〇は既に存在します。」
というエラーになってしまい、行追加が1行以上行えません。
新規行追加時、エラー対象とされている列はDefault値Nullと
なっており、その値Nullの行を複数作成する操作なので
キー重複でこのようなエラーとなっているかと思いますが、
自分としてはこのようなエラーを出さず、
画面上では明細を複数行新規追加を可能としたいのです。
(キー値は最終的に更新時にマスタから値を取得、採番してカラムにセットし登録する。
また、キー重複チェックも後でロジックを組んで行う。)

このエラーチェックを行わないようにする設定、
もしくは回避方法等ありますでしょうか?

VB2008ExpressEdition,DBはAccess2003の環境にて小規模な業務アプリの開発を行っている者です。
VBを使用してまだ2週間足らずですので、初歩的な質問かもしれませんが、よろしくお願いします。

テーブルの内容を明細表示し、登録ボタンを押すとDB更新を
行うような簡単なマスタメンテナンス画面があるとします。

明細表示のため、フォーム上にDataGridViewを作成、
DataSouceプロパティを指定し、型付きDataSetをBindさせました。
AllowUserToAddRowsプロパティはTrueとし、DataGridView上への
新規行...続きを読む

Aベストアンサー

こんにちは。

コード上で
Me.DataSet.テーブル名.PrimaryKey = Nothing
としても、
データセットデザイナで主キーを削除しても、
どちらでも出来ましたけど、どのようにやって出来なかったのですか?

QDataGridViewのフォーカス遷移について

はじめまして

C#のWindouwsアプリを開発しています。
件名に関してどなたかご教授お願いします。

事前の情報としまして、
DataGridViewのフォーカス遷移時にReadOnlyがtrueのセルには
カーソル遷移をさせたくなく、下記のサイトを参考にDataGridView
をカスタマイズしました。
http://social.msdn.microsoft.com/Forums/ja-JP/vbexpressja/thread/fc1a0d8d-23d1-4a4e-a88c-f9a1edd81cff

問題なく、動作しているのですが、
DataGridViewのCellValidatingイベントで、
各セルのエラーチェックを行っており、
入力した内容がエラーだった場合は、「e.Cancel = true」
を使用し、セルの移動をキャンセルさせています。


ここで、問題が発生しています。
カスタマイズしたDataGridViewでは、フォーカスを移動させて
いるのにもかかわらず、CellValidatingイベントでは、
セルの移動をキャンセルしているため、
カスタマイズしたDataGridViewで
「セル値の変更をコミットまたは中止できないため、操作は成功しませんでした。」
とエラーが発生してしまいます。


何か良い解決方法はありませんでしょうか??
よろしくお願いします。

はじめまして

C#のWindouwsアプリを開発しています。
件名に関してどなたかご教授お願いします。

事前の情報としまして、
DataGridViewのフォーカス遷移時にReadOnlyがtrueのセルには
カーソル遷移をさせたくなく、下記のサイトを参考にDataGridView
をカスタマイズしました。
http://social.msdn.microsoft.com/Forums/ja-JP/vbexpressja/thread/fc1a0d8d-23d1-4a4e-a88c-f9a1edd81cff

問題なく、動作しているのですが、
DataGridViewのCellValidatingイベントで、
各セルのエラーチェックを行っており、
入力...続きを読む

Aベストアンサー

微妙に違うかも知れませんが、
自分が作成した際は、
http://social.msdn.microsoft.com/Forums/ja-JP/vbexpressja/thread/c90ad027-95c3-430b-8ba1-8c16e5ba8873

「うなまな」氏の2006年5月26日 7:47回答を参考にしてうまくいきましたよ。

「次に選択されるセルを決める処理」自体を書き換えてしまう、みたいな内容です。

QDataGridViewで変更した値を反映させたい。

VB2005、SqlServer2005環境です。

デザイナ上で、DataTableをドラッグしてやると、自動的に
バインドされたDataGridViewが出てくれるので、その方法で
DataGridViewを1つ設置しました。

このDataGridViewの表の値を変えた時、それを実際のDBのテーブルにも
反映させたいなと思ってます。
これを実現するための方法を教えていただけないでしょうか?
バインドされているので、保存できればそのまま更新されるような
イメージなのですが…その方法がわかりません。

宜しくお願いします。

Aベストアンサー

ビューからだとUpdateやDeleteなど元のテーブル対する操作は自動生成されないようです

フォームに張り付いているデータセットにクエリを追加して
テーブルを操作できるようにします
表示されているテーブルアダプタをアクティブにして データ > 追加 > Queryを実行
SQLステートメントを使用するにチェック で次へ
UPDATE で次へ
ここで クエリビルダ もしくは 直接SQLを編集し『完了』をクリック

フォームに更新用ボタンを配置
そのクリックイベントに

dim row as DataRow
for each row in DS.DaTable.Rows
  if row.RowState = DRowState.Modified then
    TableAdapter.UpdateQuery( Row("Name"), Row("ID") )
  end if
next
といった具合で更新を掛けます
# 変数名などは適宜修正してください
# DS.DaTable.Rows、TableAdapter、Row("Name"), Row("ID")などです

ビューからだとUpdateやDeleteなど元のテーブル対する操作は自動生成されないようです

フォームに張り付いているデータセットにクエリを追加して
テーブルを操作できるようにします
表示されているテーブルアダプタをアクティブにして データ > 追加 > Queryを実行
SQLステートメントを使用するにチェック で次へ
UPDATE で次へ
ここで クエリビルダ もしくは 直接SQLを編集し『完了』をクリック

フォームに更新用ボタンを配置
そのクリックイベントに

dim row as DataRow
for each row in DS.Da...続きを読む

QDataTableから条件を満たした行を別のDatatableへコピーしたい

VC#2005とSQLServer2005ExpressEditionでWindowsアプリケーションを作成しています。

データベースの中から1つのマスタテーブルのデータを呼び出すのにTableAdapterを使ってDataTableにデータをバインドしました。
そこから条件を満たしている行をすべて抽出して同じ型のDataTableにデータをコピーしたいのです。

ですから、DataTableは2つ用意しています。1つは上記の通りデータをバインドしていますが、もう1つは宣言しただけなのでまだ空っぽの状態です。
DataTableにはカラムが3列あり、その中の1列をグループIDとしています。
条件としてはグループIDが同じであるということです。
やりたいことは条件を満たしている行をすべて抽出して空のデータテーブルにコピーすることです。

どなたかご存知の方いらっしゃれば教えてください。
よろしくお願いします。

Aベストアンサー

C#だったんですね … さほど変わりないと思いますが

お使いのコードが提示されていないのでこちらで適当な変数をでっち上げております
現在お使いのコードを支障の無い範囲で提示しましょう

//元のデータテーブルがdtSourceとすると
// テーブル構造をコピー
DataTable dt = dtSource.Clone();
DataRow r = null;
foreach( DataRow dtRow in dtSource.Select("選択するための文字列"))
{
  r = dt.NewRow();
  for( int n = 0; n < dtRow.ItemArray.Length; n++ )
  {
    r[n] = dtRow[n];
  }
  dt.Rows.Add( r );
}
といった具合になると思います

# 前回の投稿中のstSorceはdtSourceの単なるミスです

QVB.NET DataGridView 縦スクロールバーを常に表示

VB.netについてなのですが、
DataGridViewの縦スクロールバーを常に表示したいです。
データ数によってスクロールバーが表示されたり非表示になったりしていますが、常に表示することは可能でしょうか。教えてください。

環境:
Visualstudio2005
windows XP
よろしくお願いします。

Aベストアンサー

Private vsBar As VScrollBar
Private Sub DataGridViewScrollBar_Load(ByVal sender As Object, ByVal e As EventArgs)
Me.tESTTableAdapter.Fill(Me.testdbDataSet.TEST)

For Each c As Control In dataGridView1.Controls
If TypeOf c Is VScrollBar Then
vsBar = DirectCast(c, VScrollBar)

AddHandler vsBar.VisibleChanged, AddressOf vsBar_VisibleChanged
End If
Next
End Sub
Private Sub vsBar_VisibleChanged(ByVal sender As Object, ByVal e As EventArgs)
If Not vsBar.Visible Then
'縦クロースバーを常に表示する。
Dim borderWidth As Integer = 2

vsBar.Location = New Point(Me.dataGridView1.ClientRectangle.Width - vsBar.Width, 0)
vsBar.Size = New Size(vsBar.Width, Me.dataGridView1.ClientRectangle.Height - borderWidth)
vsBar.Show()
End If
End Sub

ミスしてたらごめんなさい・・・orz

Private vsBar As VScrollBar
Private Sub DataGridViewScrollBar_Load(ByVal sender As Object, ByVal e As EventArgs)
Me.tESTTableAdapter.Fill(Me.testdbDataSet.TEST)

For Each c As Control In dataGridView1.Controls
If TypeOf c Is VScrollBar Then
vsBar = DirectCast(c, VScrollBar)

AddHandler vsBar.VisibleChanged, AddressOf vsBar_VisibleChanged
End If
Next
End Sub
Private Sub vsBar_VisibleChanged(ByVal ...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング