コンボボックスで選択した値をデータグリッドビューで選択

タグの編集
投稿者 JUN  (社会人) 投稿日時 2009/3/31 00:21:23
VB2005
XPで開発しています。

VB歴2ヶ月弱です。


コンボボックスで選択した項目をデータグリッドビューで選択したいのですが、いろいろなサイトを見ても答えが見つかりません。

わかりやすくいいますと、コンボボックスで「1」という項目を選択したら、データグリッドビューのコード「1」が選択される…というようなことをやりたいのです。

コンボボックスのSelectedIndexChangedを使うとは思うのですが、どうしたらDatagridviewが選択されるのかがわかりません。


ヒントだけでもいいので皆様のお力添えを宜しくお願い致します。
投稿者 通りすがり  (社会人) 投稿日時 2009/4/1 00:04:54
ではヒントだけ。
「DataGridView 選択」で検索すべし!

DataGridViewで選択されている列、行、セルを取得する、または列、行、セルを選択する
http://dobon.net/vb/dotnet/datagridview/selectedcells.html
投稿者 jun  (社会人) 投稿日時 2009/4/1 01:46:13
通りすがりさん。ありがとうございます。

もらったヒントを使ってコンボボックスで表示された数字以外をデータグリッドビューで非表示にさせることができました。

しかし以下のコードだと、一回目はきちんとコンボボックスで選択した数字以外は非表示になったのですが、二回目に選択すると”現在のセルを非可視セルに設定することはできません。”というエラーがでてきてしまいます。

  Private Sub hihyouji()
        Dim flg As String
        Dim rowco As Integer = DataGridView1.RowCount

        rowco -= 1 'データグリッドの総行数-1
        DataGridView1.CurrentCell = DataGridView1(0, rowco)

        For i as Integer   0 To rowco
            ' コードの値を取得()
            flg = DataGridView1(0, i).Value
            'セルの列を確認()
            'コードの値以外を、非表示にする。
            'MsgBox(DataGridView1(0, i).Value & " " & cmb_ntcd.Text.Trim() & " " & DataGridView1.RowCount)
            If flg.Trim() = cmb_ntcd.Text.Trim() Then

                DataGridView1.Rows(i).Visible = True
                DataGridView1.CurrentCell = DataGridView1(0, i)
            Else
                Dim row_no As Integer = DataGridView1.CurrentCell.RowIndex
                MsgBox(row_no)
                DataGridView1.Rows(i).Visible = False
            End If
        Next
    End Sub

どこが悪いのでしょうか?

ご回答願います。
投稿者 通りすがり  (社会人) 投稿日時 2009/4/1 07:07:05
うむむむむ。。。
やりたいことがわからなくなってしまいました。。。

>わかりやすくいいますと、コンボボックスで「1」という項目を選択したら、データグリッドビューのコード「1」が選択される…というようなことをやりたいのです。

から私が解釈した動作は、

Private Sub ComboBox1_SelectedIndexChanged()

    For i as integer = 0 to DataGridView1.RowCount-1
        'コンボボックスで選択されている値と同じ値の場合そのセル(行?)を選択する 
        If DataGridView1(コード列,i).Value = ComboBox1.Text Then
           DataGridView1(コード列,i).Selected = True
       End If
    Next

End Sub



こんな感じだったので、

DataGridView1(コード列,i).Selected = True

ここの部分を聞いているのかと思い、参考のURLを示したんですが、はずしちゃったみたいですかね。。。


「データグリッドビューで選択」の「選択」はどういう意味で使っていますか?
もう一度やりたいことを整理して箇条書きにしてみませんか?


投稿者 ヴァン  (社会人) 投稿日時 2009/4/1 07:39:58
>二回目に選択すると”現在のセルを非可視セルに設定することはできません

Visible が False になっている行を CurrentCell には出来ないということですね。
投稿者 jun  (社会人) 投稿日時 2009/4/1 18:42:48
通りすがりさん>

すみません。説明不足でした;

コンボボックスで選択した値がデータグリッドビューで選択され、データグリッドビューで選択された値が入っている行以外を表示させない…が私がやりたかったことです。


データグリッドビューでクリックした行以外は非表示にさせることができていたので、「データグリッドビューで選択された値以外を表示させない…」という部分を入れるのを忘れてしまいました。大変申し訳ございません。

通りすがりさんのおかげで、コンボボックスで選択した値がデータグリッドビューで選択される…まではできたのですが、今度は上記のエラーがでてしまい、選択された行以外を非表示にできなくなってしまいました;

「コンボボックスで選択した値がデータグリッドビューで選択される」と「データグリッドビューで選択された値以外を非表示にさせる」の二つはあわせることはできないのでしょうか?



投稿者 jun  (社会人) 投稿日時 2009/4/1 18:45:29
ヴァンさん>

>Visible が False になっている行を CurrentCell には出来ないということですね。


その通りです。Visible が False になっている行は選択できない…ということですよね?

なんとかVisibleを使っていても CurrentCell にする…と似たようなことはできないものでしょうか?

投稿者 ヴァン  (社会人) 投稿日時 2009/4/1 19:10:45
Visible が False ですから表示がされていません。
ですから、選択することはできません。

まずはエラーがどの行で出ているかきちんと確認してください。
投稿者 JUN  (社会人) 投稿日時 2009/4/3 01:18:49
ヴァンさん>

すみません。あれからいろいろと調べたのですが、私の頭では理解できずどうしても自分の思っている通りにできません。


私がやりたいのは

     For i As Integer = 0 To DataGridView1.RowCount - 1
            'コンボボックスで選択されている値と同じ値の場合その行を選択する 
            If DataGridView1(0, i).Value = cmb_ntcd.Text Then
                DataGridView1(0, i).Selected = True
            Else
                DataGridView1(0, i).Selected = False
            End If

        Next

でコンボボックスで選択した値をデータグリッドビューで選択し、
 
Dim flg As String
 For i As Integer = 0 To DataGridview1.Rowcount-1

            ' コードの値を取得()
            flg = DataGridView1(0, i).Value
            'セルの列を確認()
            'コードの値以外を、非表示にする。
               If DataGridView1(0, i).Selected = True Then
                DataGridView1.Rows(i).Visible = True

            Else
                If DataGridView1.Rows(i).Visible = True Then
                    DataGridView1.Rows(i).Visible = False
                End If
            End If

選択している値以外を非表示にさせたいのです。



とりあえず結果として

「コンボボックスで選択した値とデータグリッドビューで同じ値を持つ行だけを表示させるようにしたい」のです。

最初の一回目は表示できるのですが、二回目以降は非表示の部分を選択しようとしてエラーがでてしまいます…;

Visibleを使う以外に、選択した値だけをデータグリッドビューに表示できるやり方はあるのでしょうか?

よろしくお願いします。




投稿者 ヴァン  (社会人) 投稿日時 2009/4/3 02:45:15
こんにちは

こんな感じではどうでしょうか。

    Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click
        For Each row As DataGridViewRow In DataGridView1.Rows
            If row.Cells(0).Value = ComboBox1.Text Then
                row.Visible = True
                row.Selected = True
            Else
                row.Visible = False
                row.Selected = False
            End If
        Next

    End Sub

投稿者 jun  (社会人) 投稿日時 2009/4/3 03:49:18
ヴァンさん>

ご返信ありがとうございます。

SelectedIndexChangedにヴァンさんが書かれたコードを打つと(そのままは打ってません)



「現在のマネージャの位置に関連付けられた行を非表示にすることはできません。」

というエラーが出てきてしまいます。


私のも一回目は選択した値の行以外を非表示にさせることができたのですが、やはり二回目以降に値を選択しようとすると同じエラーが出てきてしまいます。


現在選択している行を非表示にはできない…という意味だと思うのですが;


投稿者 ヴァン  (社会人) 投稿日時 2009/4/3 03:58:28
DataGridView.ClearSelection をFor Each の前に入れてみてはどうでしょうか。
投稿者 JUN  (社会人) 投稿日時 2009/4/6 22:39:48
ヴァンさん>

返信が遅くなって申し訳ありません。

ClearSelection()を使ってみましたが、やはり同じエラーが出てしまいます…;

どうやらClearSelection()は選択をしていないわけではなく視覚的に選択されていることが見えていない…みたいです;

あれから試行錯誤しましたが、どうやら私のレベルではVisibleを使ってやりたいことをやるのは少し難しいようです。

とりあえず今は勉強して、もう少し力をつけてから質問などをしていきたいと思います。


返信くださったお二方、本当にありがとうございました。