tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルDataGridView でデータを選択し削除する方法
記事No4825
投稿日: 2007/01/17(Wed) 10:19
投稿者やまもと
環境: Visual Basic 2005

以下、サンプルコードです。

Form に DataGridView と Button を配置し、
以下のコードを貼り付けて、実行してみてください。

Public Class Form1

    Dim table As New System.Data.DataTable

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        ' テーブルの作成
        With table
            .Columns.Add("no", System.Type.GetType("System.Int16"))
            .Columns.Add("f1", System.Type.GetType("System.String"))
            .Columns.Add("f2", System.Type.GetType("System.String"))
        End With

        ' データの作成
        table.Rows.Add(New Object() {1, "a", "x1"})
        table.Rows.Add(New Object() {2, "b", "d2"})
        table.Rows.Add(New Object() {3, "c", "c3"})
        table.Rows.Add(New Object() {4, "d", "m4"})

        ' 作成したテーブル(データ)を DataGridView に表示
        DataGridView1.DataSource = table

        ' DataGridView の設定
        With DataGridView1
            .AllowUserToAddRows = False
            .AllowUserToDeleteRows = False
            .AllowUserToResizeRows = False
            .MultiSelect = False
            .SelectionMode = DataGridViewSelectionMode.FullRowSelect
            .RowHeadersVisible = False
            .ReadOnly = True
        End With

        ' ボタン名の設定
        Button1.Text = "削除"

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        ' 選択行がない場合は処理を抜ける
        If DataGridView1.SelectedRows.Count = 0 Then Exit Sub

        ' 選択行のデータを削除
        table.Rows.RemoveAt(DataGridView1.SelectedRows(0).Index)

    End Sub

End Class

・ 4レコードのデータを DataGridView に表示
・ データを選択
・ 選択中のデータを削除
というものです。

基本的には、正常に動いているように見えますが、
たとえば、 f2 のカラムヘッダをクリックして
ソートしてしまうと、
選択行ではない行が削除されてしまいます。
( DataGridView 上はソートされますが、
   DataTable 上はソートされていない?)

ソートした場合などに、
DataGridView で選択中のデータが
DataTable 内のどのレコードなのかを知る方法はありますでしょうか?

※ちなみに、サンプルなので、カラム数が少ないですが、
  実際にはもっと多くのカラムがあり、
  また、ユニークとなるようなカラムはありません。

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

[ツリー表示へ]
タイトルRe: DataGridView でデータを選択し削除する方法
記事No4826
投稿日: 2007/01/17(Wed) 12:01
投稿者Hongliang
DataTable の行に順番と言う概念は基本的に存在しません。
順番と言うのは見た目上の概念ですから。
ですのでソートってのは意味がありません。

2005(.NET 2.0)なら BindingSource を使えば、
コントロールの見た目上の位置から(実際のデータ上の位置を意識せずに)扱うことが可能です。

[ツリー表示へ]
タイトルRe^2: DataGridView でデータを選択し削除する方法
記事No4855
投稿日: 2007/01/19(Fri) 11:14
投稿者やまもと

次のようにすることで対応できました ^^

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        ' 選択行がない場合は処理を抜ける
        If DataGridView1.SelectedRows.Count = 0 Then Exit Sub

        ' 選択行のデータを削除
        table.DefaultView(DataGridView1.SelectedRows(0).Index).Delete()

    End Sub

> 2005(.NET 2.0)なら BindingSource を使えば、
> コントロールの見た目上の位置から(実際のデータ上の位置を意識せずに)扱うことが可能です。

使い方が分かりませんでした・・・

[ツリー表示へ]