DataGridViewへの色付き文字による書き込み

タグの編集
投稿者 ikex  (社会人) 投稿日時 2012/5/10 11:59:33
Visual Basic 2010と2005を使用しています。

以下のようなプログラムを作成しようとしています。
1.Form1である判定を行い、Form2のDataGridView1に書き込む。
  Form2はForm2.Showで呼び出す。

2.Form2のDataGridView1の行をドラッグ+ボタンクリックで
  判定の詳細情報を表示する。
  詳細情報はForm3のDataGridView1に表示させる。

この「1」の段階で
判定がOKの場合の行は黒で、判定がNOの場合の行は赤で
それぞれDataGridView1に書き込み+表示
を行いたいのですが、
容易に出来ますでしょうか?
投稿者 m190  (社会人) 投稿日時 2012/5/10 21:01:01
容易にとは申しませんが

1)ある判定を行う
2)Form2で表示するデータを用意する
3)Form3で表示するデータを用意する
4)用意したデータを Form2の DataGridViewに書き込む
5)用意したデータを Form3の DataGridViewに書き込む
6)DataGridView の行ごとに色を塗り分ける
7)Formから他の Formを表示させる
8)ドラッグ+ボタンクリックで他の Formを表示させる

などの様に、1つ1つを単純な作業に切り分けて考えれば
1つ1つは容易な作業になりませんか?

その上で具体的に分からないことが出てきたら
改めて具体的な質問をなさってみてはいかがでしょうか。
具体的な内容であれば、きっと詳しい方も答え易くなると思います。

投稿者 m190  (社会人) 投稿日時 2012/5/11 06:30:20
これまで私が VB2010 で扱ったことのあるコントロールはボタンとパネル、それと先日カレンダーを少々といった程度なもので、
昔の古いアクセスやエクセルで作業するような感覚で書いてます。なので、具体的なプロパティ名などが分かりませんし、ひょっとしたらそんな手法は使えない、そんなプロパティは無い、なんて場合もあるかもしれませんので、その点は予めご容赦頂きたいと思います。


ある判定を行った結果を基にデータ(表示させる前のデータ)を用意する際に、
表示させる文字データの他にも、後々の処理の判断で必要となる情報を、文字データとは別のフィールド(文字データと同じ行で別の列)などに持たせる必要があるように思います。たとえば、文字の色を赤に変えるかどうか判断するために、OnとOff、あるいは TrueやFalseなど何らかの情報が必要になる、といった感じの話です。

文字そのものに表示色の情報も持たせる(という表現が適切かどうかは分かりませんが)リッチテキストの場合であれば、この情報は
必要ないかもしれませんが、その先の処理を考えると、詳細を表示させる場合に空っぽの詳細を表示させて良いのか・表示させないのかを判断するための情報も必要な気がしますし、さらにその詳細を表示させる・させないの手法の部分で、行を選択可能にするか不可にするか判断する情報が必要になるのではないかと思います。

#おそらくドラッグ+ボタンクリックというのは、複数行を選択可能にしておき、ボタンをクリックした時点で、選択されている
#それぞれの行(に対応する詳細データ)をまとめて、 Form3 に書き込み&表示させることではないか、と受け取りました

なのですが
今回の場合ですと、詳細を持つか持たないかの情報と、文字を赤で表示させるかどうかの情報、
さらには選択可能にするかどうかの情報は、3つとも一致するもののように思います。
そこで仮に
2列のテーブルを用意したとして、1列目に From2用のデータ、2列目に Form3用の詳細データを格納するような形にすると、
2列目(詳細データ)が空っぽかどうかを判断することで、1列目を Form2 に表示させる際の色分けや選択可否の処理が
行えるようになるんじゃないか、などと考えました。


具体的なコードではなく、コーディング以前の筋道の立て方というか考え方にとどまる上に、
少々分かりにくい文章になってしまって本当に申し訳ありませんが、今の私にはこれが精一杯です。
ただ、それでも何か参考になるようなことがあれば、と思って書き込みさせて頂きました。

まず大前提として、
同じことをやるにしても、それをどう実現するかは様々な手法が考えられると思います。
色々なアイデアを検討し自分なりに工夫を加え、より良い手法を見つけ出すようにしてみてください。
素晴らし作品が完成すると良いですね、プログラムの作成がんばってください。

投稿者 るきお  (社会人) 投稿日時 2012/5/11 13:13:51
一例です。
Form1にButtonを1つ配置、Form2にDataGridViewを1つ配置して下記プログラムで試せます。

Form1側
Public Class Form1

    Private f2 As Form2


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

        If f2 Is Nothing Then
            f2 = New Form2
            f2.Show()
        End If

        'ある判定(=ここでは現在の秒が偶数であるかの確認)を行う。 
        Dim second As Integer = Now.Second

        If second Mod 2 = 0 Then
            f2.WriteMessage("現在の秒は偶数です。" & second, True)
        Else
            f2.WriteMessage("偶数じゃない!" & second, False)
        End If


    End Sub

End Class


Form2側
Public Class Form2

    Private Sub Form2_Load(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles MyBase.Load

        Dim table As New DataTable
        table.Columns.Add("Message"GetType(String))
        DataGridView1.DataSource = table

    End Sub

    Public Sub WriteMessage(ByVal message As StringByVal isOK As Boolean)

        Dim table As DataTable = DataGridView1.DataSource
        table.Rows.Add(message)

        If Not isOK Then
            Dim gridRow As DataGridViewRow = DataGridView1.Rows(table.Rows.Count - 1)
            gridRow.Cells(0).Style.ForeColor = Color.Red
        End If

    End Sub
End Class


Form2.Showではなく、f2.Showですが私にはこちらの方がしっくり来ます。
投稿者 ikex  (社会人) 投稿日時 2012/5/21 15:55:20
ml90様、るきお様

ご返信ありがとうございます。
プログラム以外の仕事が立て込んでしまい
この掲示板にアクセスする時間がありませんでした。
申し訳ありません。
るきお様の案を試してみたいと思います。
ありがとうございました。