• 締切済み

別フォームからdatagridviewの削除

vb.netで、form1のdatagridviewを、form2のボタンをクリックした際に、datagridviewのrowを削除したいのですが、newでform1を参照して、datagridviewのrowを削除しようとしたのですが、form1のdatagridviewの情報をform2で取得できなくて、実行時エラーになってしまい困っています。 form1のdatagridviewのデータは、csvファイルを接続して、loadイベントで表示させるようにしています。 わかるかたいらっしゃいましたら、教えていただけると助かります。 宜しくお願いいたします。

みんなの回答

  • JUN8731
  • ベストアンサー率45% (9/20)
回答No.1

はじめまして。 表示する順序は[form1]⇒[form2]でしょうか。 もしそうなら、form2をNewする際に、form1のdatagridViewのオブジェクトを 渡してしまってはどうでしょうか。 おそらくそれでform2からform1のdatagridViewを操作できると思います。 <例> ○form1側  Dim frm as new form2(Me.datagridview)  frm.show ○form2側   Private parent_datagridview as DataGridView  Public Sub New(Byval datagridview as DataGridView)     ' この呼び出しは、Windows フォーム デザイナで必要です。      InitializeComponent()    ' InitializeComponent() 呼び出しの後で初期化を追加します     Me.parent_datagridview = parent_datagridview End Sub いかがでしょうか。

natingut
質問者

お礼

お返事ありがとうございます。 丁寧にソースまでつけていただきありがとうございます。

関連するQ&A

  • DataGridViewの値を別フォームに

    こんにちは。 1つ教えて頂けないでしょうか。 Form1にDataGridViewがあり、どれか1行ダブルクリックすると Form2にForm1のDataGridViewの7列目の値の条件で抽出した結果を Form2のDataGridViewに表示したいのです。 Form1からの受け渡しデータはForm2のテキストボックス(条件)に表示させ 受け渡されて来たときは表示ボタンをクリックしなくてもForm2の DataGridViewは表示したいのです。 それぞれのFormは作成し、Form1は Private Sub dgv_CellDoubleClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgv.CellDoubleClick Dim f As New Form2 f.txt条件 = Me.DataGridView.SelectedRows(0).Cells(7).Value f.ShowDialog() End Sub とコーディングしました。 Form2は表示されるのですが、データの受け渡しができていないし f.txt条件 = Me.DataGridView.SelectedRows(0).Cells(7).Valueの部分でキャストできませんのエラーに なります。 DataGridViewの選択した値を別のフォームに渡し、そのまま別フォームのDataGridViewを表示させたいのですが。 わかる方おられましたら、教えて頂けないでしょうか。 大変申し訳ありませんが、どうぞよろしくお願いします。

  • Form1_Loadイベントのコードよりプロパティが優先?

    vb2005です。 フォーム1にDataGridView1を設置し、アクセスのテーブルにバインドしています。 デザインのプロパティでは「30」、 コードの Form1_Loadイベントには Me.DataGridView1.RowTemplate.Height = 15 として実行すると、 最初は30の行の高さで表示され、 フィールド部分をクリックして並べ替えると、 15になります。 Form1_Loadイベントに、 MsgBox(Me.DataGridView1.RowTemplate.Height) Me.DataGridView1.RowTemplate.Height = 15 MsgBox(Me.DataGridView1.RowTemplate.Height) としてみたら、 「30」→「15」となりました。 と言うことは、フォーム表示時には15にならなければいけないのに、30の高さで表示されます。 どういうことなのでしょうか? よろしくお願いします。

  • DataGridViewについて

    Fom1のDataGridViewから選択した行のデータをForm2のDataGridViewに渡し、Form2で編集しFom1に反映せると、どの行のデータも1行目に入ってしまいます。 どのようなコードで解決できますか? 【Form1】 private void DataGridView1_SelectedRowsDoubleClick(Object sender, MouseEventArgs e) { // Form2を作成し、親フォームとしてForm1を設定する Form2 f2 = new Form2(); f2.Owner = this; // 親フォームを設定 // 選択行のデータを渡す f2.SetRowData(dataGridView1.SelectedRows, dataGridView1); // Form2を表示する f2.Show(); } /// <summary> /// 選択行のデータを更新するメソッド public void UpdateSelectedRowData(int rowIndex, string editedData1, string editedData2, string editedData3) { // データソースが DataTable の場合のみ処理を実行する if (dataGridView1.DataSource is DataTable dt && dt.Rows.Count > rowIndex) { // データ行を取得する DataRow dataRow = dt.Rows[rowIndex]; // 編集データを新しいデータ行にセットする dataRow["date"] = editedData1; dataRow["name"] = editedData2; dataRow["week"] = editedData3; } } } } 【Form2】 public void SetRowData(DataGridViewSelectedRowCollection rows, DataGridView dataGridView)  { //データテーブルの作成 DataTable dt = createData(); foreach (DataGridViewRow r in rows) { //1列目~3列目を取り出す string s1 = r.Cells[1].Value.ToString(); // 日付 string s2 = r.Cells[2].Value.ToString(); // 名前 string s3 = r.Cells[3].Value.ToString(); // 曜日 dt.Rows.Add("2023年", s1, s2, s3); //日付順に昇順に表示する dt.DefaultView.Sort = "日付 ASC"; } //一覧を表示する dataGridViewDisp2(dt); } // 編集後のデータを保持するためのプロパティ public string EditedData1 { get; set; } public string EditedData2 { get; set; } public string EditedData3 { get; set; } /// 更新ボタンの処理 private void savebtn_Click(object sender, EventArgs e) { // 親フォーム Form1 をForm1に指定する Form1 form1 = this.Owner as Form1; if (form1 != null) { // Form1のDataGridViewのデータソースを取得する DataTable dt = form1.dataGridView1.DataSource as DataTable; if (dt != null) { // dataGridView2の各行を処理する foreach (DataGridViewRow row in dataGridView2.Rows) { // 新規行はスキップする if (row.IsNewRow) continue; // 編集されたデータを取得する string editedData1 = row.Cells[1].Value.ToString(); string editedData2 = row.Cells[2].Value.ToString(); string editedData3 = row.Cells[3].Value.ToString(); // 選択された行のインデックスを取得する int rowIndex = row.Index; // 親フォーム Form1 の UpdateSelectedRowData メソッドを呼び出す form1.UpdateSelectedRowData(rowIndex, editedData1, editedData2, editedData3); } } } // 現在のフォームを閉じる this.Close(); } } }

  • VB.NETでフォーム間でのコントロールの参照

    VB.NETでフォーム間でのコントロールの参照が うまくいかず困っています Windows フォーム Form1とForm2があります Form1にはリストビュー(name:ListView1)を配置しています Form1_LoadイベントでListView1にアイテムを追加します Form2を表示し、Form1のListView1のアイテム数を、 取得しようとすると 0 になってしまします どうすればForm2から取得できるのでしょうか? 次のように書いています Form1_Load イベント内 ListView1.Items.Add("Item1") ListView1.Items.Add("Item2") ListView1.Items.Add("Item3") MessageBox.Show(CStr(ListView1.Items.Count), "Form1") Dim Form2 As New Form2() Form2.Show() Form2_Load イベント内 Dim Form1 As New Form1() MessageBox.Show(CStr(Form1.ListView1.Items.Count), "Form2")

  • C# datagridviewの使い方

    vs community2017 ver15.1でC#を独学しています。 親フォームで取得したデータを子フォームにあるdatagridviewで表示させたいのですが、うまくいきません。 子formのdesigner.csでstaticをpublicにしています。 public System.Windows.Forms.DataGridView dataGridView1; public System.Windows.Forms.DataGridViewTextBoxColumn Column1; public System.Windows.Forms.DataGridViewTextBoxColumn Column2; public System.Windows.Forms.DataGridViewTextBoxColumn Column3; public System.Windows.Forms.DataGridViewTextBoxColumn Column4; 親formのcsファイルで以下のように使用しています。 Form2 kofm = new Form2(); kofm.dataGridView1[0, 0].Value = "aaa"; kofm.StartPosition = FormStartPosition.CenterScreen; kofm.ShowDialog(); これで実行すると、以下のエラーになります。 System.ArgumentOutOfRangeException が発生しました HResult=0x80131502 Message=インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。 親フォームのボタンをクリックし、子フォームのdatagridviewに表示させるにはどのようにすればよろしいのでしょうか? 教えてください。 よろしくお願いします。

  • VB.Netのフォームロードイベントについて

    こんにちわ。 いまVB.Net2005Expressで勉強をしている者です。 あるフォームがロードされるときの処理を書こうとすると, 従来のVB6ではFormオブジェクトにLoadイベントがありましたが, VB.Net2005では,最初の状態ではフォームのイベントには 「New」,「Finalize」,「InitializeComponent」の3つしかありません。 もしVB.Net2005でForm_Loadイベントを書きたいときは, 自分で, 「Private Sub Form1_Load(Byval ~」と書かなくてはいけないのでしょうか? 初歩的な質問になるかもしれませんが,教えてください。 よろしくお願いします。

  • DataGridViewでMauseDown

    VB.NETでDataGridViewでMauseDownイベントを実装するとCellContentClickイベントやCellClickイベントが発生しなくなりました。 VB.NETのバージョンは4.6.2です。 Panelコントロール上に配置したDataGridViewのCellContentClickイベント内でClickされたセルの列に応じた処理を行っています。 このDataGridViewにDrag&Dropの機能を設けるべく、MouseDownイベントを追加しました。 MouseDownイベント内に記述した処理の動作も問題無く、全体の動作確認を行っていると、DataGridViewのCellContentClickイベントが発生していない事に気がつきました。 CellContentClickイベント内の処理の1行目にブレークポイントを設置して確認しました。 試しにMouseDownイベント自体をコメントアウトするとCellContentClickイベント内の処理は実行されました。 MouseDownイベント、CellContentClickイベントの両方を動作させる方法はありますでしょうか?

  • DataGridView のSUB制御

    Windows 7 Professional に、Microsoft Visual Basic 2010 Express をインストールしました。 今までEXCELやAccessのフォームを使って作成していたVBAプログラムを移植しようと考えています。 その中で、いろいろ試しているうち、妙な現象に悩まされています。 例として、プロジェクト内にForm3を作成します。 そのForm3の中にDataGridView1を設置します。 Form3内のForm3_Load や、ボタンのプロシージャーに Me.DataGridView1.DataSource = ○○ や、 Me.DataGridView1(0, 0).Style.BackColor = Color.Orange 等を記述して実行すると、うまくデータソースを読み込んだり、指定のセルが塗られたりします。 ところが、 Module1 を作成し、そこに Public Sub test01 を作成して、 Form3.DataGridView1.DataSource = ○○ と記述し、call で test01を呼び出すと、全く表示されません。 Form3.DataGridView1(0, 0).Style.BackColor = Color.Orange などは、インデックスの範囲エラーと出てしまいました。 おかしいと思い、ブレークポイントを指定して、ステップ実行したところ call で呼び出されたtest01をステップしている最中に、 Debug.Print(Form3.DataGridView1.Columns.Count) を通過したところでは、カウント数がデータソースの行数になりますが、test01 のend sub まで実行して、form3のプロシージャーに戻ったところにも、Debug.Print(Me.DataGridView1.Columns.Count)を仕掛けて通過させたところ、イミディエイトウィンドウに表示された値は0でした。 つまり、呼び出したプロシージャー内では値をセットしたのに、戻った途端、それがすべて消えてしまった事になります。 VBAでこのような現象にぶつかった事がないので、ご質問ですが、Visual Basic 2010 では、sub の記述で、Form上のコントロールを制御する事はできないのでしょうか? Public Sub からFrom上の、特にDataGridViewを制御するのに、なにか必要な事があったら、教えてください。

  • VB2005 DataGridViewにチェックボックスを追加する方法

    タイトル通りなのですが VB2005でDataGridViewにチェックボックスを追加したいです。 ############################################################### Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim chColumn As New DataGridViewCheckboxColmun DataGridView1.ColumnCount = 5 DataGridView1.Columns(0).HeaderText = "1" DataGridView1.Columns(1).HeaderText = "2" DataGridView1.Columns(2).HeaderText = "3" DataGridView1.Columns.Insert(4, chColumn) End Sub End Class ############################################################## Dim chColumn As New DataGridViewCheckboxColmun ↑で'型'DataGridViewCheckboxColmunが定義されていません となってしまいます。 どうすればよいでしょうか。。。。 プログラム初めて1週間の初心者なのでお手柔らかに よろしくお願いします。

  • C# DataGridViewにデータを追加したい。

    C# DataGridViewにデータを追加したい。 DataGridViewにレコードを追加したいのですが、Formのロードイベントで以下コードを実行しています。 // テーブルを作成 DataSet dataSet1 = new DataSet("商品マスター"); DataTable dataTable1 = dataSet1.Tables.Add("製品テーブル"); DataColumn dataClumn1 = dataTable1.Columns.Add("ID", typeof(int)); DataColumn dataClumn2 = dataTable1.Columns.Add("名前", typeof(int)); // テーブルにデータを追加 dataTable1.Rows.Add(new Object[] { 1, name1}); dataTable1.Rows.Add(new Object[] { 2, name2}); dataGridView1.DataSource = dataTable1; としています。 Formにボタンを配置し、ボタンクリック時にテキストボックス[txtProName]のデータを レコード追加したいのですが、記入の仕方がわかりません。 まず、 DataSet dataSet1 = new DataSet("商品マスター"); DataTable dataTable1 = dataSet1.Tables.Add("製品テーブル"); をロードイベントメソッドに記入しているのも問題がありそうなのですが、 良く理解できません。 ボタンイベントでデータを挿入する方法等、記入方法のご教授よろしくお願いいたします。 当方、超初心者なので、出来れば、ソースコードもお願いいたします。m(_ _)m

専門家に質問してみよう