ListBox→修正ボタン→Form2 への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 Norimasa  (学生) 投稿日時 2010/6/2 09:13:28
おはようございます。

るきおさん
ありがとうございました。
DataSetとDataTableをまだイマイチ理解していませんでした。
確かにshortscheduleListBox1が連結されているのはDataTableの方でした。

>表示には必要なくても最初にstartdateも取得するように細工しておくとよい

このおかげで全データをUpDateFormへ送ることができ、そして、修正した内容をDataTableへ渡す事もできました。

後はDataTableの内容をBDへ反映させるだけです。

こちらも、チャレンジしてみます。


ありがとうございました。
投稿者 るきお  (社会人) 投稿日時 2010/5/31 22:26:10
こんにちは。
UpDateFormに表示するのはリストボックスの選択されている行ということでよいですよね?

まず、後でstartdateを使うようなので、表示には必要なくても最初にstartdateも取得するように細工しておくとよいです。
そのためにSQL文の行を以下のように修正します。
    
Command.CommandText = "SELECT startdate, start + '~' + [end] + ': ' + subject + ' ' + contents as schedule FROM Short WHERE startdate = '" & startdate & "'"


この細工ができていれば、ストレートに質問に答えてDataRowを取得するには次のようにします。
    
Dim UpDateForm As UpdateDate = New UpdateDate()

'Dim DataSet As DataSet = DirectCast(Me.shortscheduleListBox.DataSource, DataSet) 

Dim Row As DataRow = DirectCast(shortscheduleListBox.SelectedItem, DataRowView).Row
Dim Value As String

Value = Row("startdate")
UpDateForm.startdateTextBox.Text = Value
UpDateForm.ShowDialog()


しかし、DataRowを習得するのではなく値を取得したいだけであれば次のように書くこともできます。
    
Dim UpDateForm As UpdateDate = New UpdateDate()
Dim Value As String

Value = shortscheduleListBox.SelectedItem("startdate")
UpDateForm.startdateTextBox.Text = Value
UpDateForm.ShowDialog()


NorimasaさんのプログラムではshortscheduleListBoxに連結されているDataSetから行を手繰り寄せようとしていますが、現在選択されている行を判断・取得する方法がわからないということだと思います。
リストボックス自体に選択されている項目を表すSelectedItemプロパティがあるのでDataSetまでさかのぼらないで直接SelectedItemをとってくるのが早いです。

今回はDataTableとListBoxが連結されているのでSelectedItemの実際の型はDataRowViewになります。SelectedItemの実際の型はListBoxの表示のさせ方により異なります。

それから、shortscheduleListBoxに連結されているのはDataSetではなくDataTableです。
これはNorimasaさん自身が
    
Me.shortscheduleListBox.DataSource = DataSet.Tables(DataSet.Tables(0).ToString)

と書いていることによります。

本題とはずれますがこの記述はやや冗長で次のように書くこともできます。
    
Me.shortscheduleListBox.DataSource = DataSet.Tables(0)


ただ、私ならはじめからDataSetを生成しないでDataTableを直接Fillします。だんだん本題からはずれていくのでこのあたりで。
投稿者 Norimasa  (学生) 投稿日時 2010/5/31 18:25:33
こんにちわ。Norimasaです。


先日はありがとうございました。VBとDB間の読み書きはできるようになりました。

今はDetaSetを勉強していますが、どうしても分からない所があり、またお伺いさせていただきました。


環境:XP-pro/VB2005/SQLServer2005


前回と同じでScheduleList管理システムを作っています。

画面は左右で割ると

左側に、 
---------------------------------------------------------------------
         MonthCalendar、

日にちを表すStartDateTextBox/開始時間を表すDomainUpDown
                                           /終了時間を表すDomainUpDown

件名を入力するSubjectTextBox
内容を入力するContentsTextBox
登録ボタン

右側に、
-----------------------------------------------------------
        スケジュールを表示するshortscheduleListBox
               修正ボタン/削除ボタン

となっております。




日にち時間、件名、内容を記入して登録ボタンを押すと、shortscheduleListBoxに表示され、同時にDBも書き込まれるようになっています。

shortscheduleListBoxに表示されるのは

開始時間~終了時間 件名 内容

です。

カレンダーをクリックするとDBからその日の日付の予定をshortscheduleListBoxに表示できるようにしました。



修正ボタンを押すと別のフォームUpdateFormへ行き、修正専用の画面が出るようにしています。(まだ画面が出るだけの状態です)

修正画面は本画面の左側と同じでカレンダーがないバージョンです。



・今回分からない部分というのは、

カレンダーをクリックしListBox上にデータを表示させ、そのデータを仮に

16:00~17:00  第1回(件名)  会議(内容)

としたとき、選択肢し修正ボタンをクリックしたら、修正画面になり、

修正画面
------------------------------------------------------------------

日にちTextBox:2010/05/31  / 開始時刻Text:16:00
                  /終了時刻Text:17:00

          件名TextBox:第1回
           内容TextBox:会議

---------------------------------------------------------------------

と表示されている状態にしたいです。

現状のコードは、

Private Sub RefreshListBox()

        Dim Connection As New SqlConnection()
        Dim Command As New SqlCommand()
        Dim DataSet As New DataSet("Short")
        Dim SQLAdapter As New SqlDataAdapter()

        '接続文字列の取得
        Connection.ConnectionString = "Data Source=サーバー名;Initial Catalog=ScheduleList;Integrated Security=True"
        'コネクションの定義
        Command.Connection = Connection
        Try
            Command.CommandText = "SELECT start + '~' + [end] + ': ' + subject + ' ' + contents as schedule FROM Short WHERE startdate = '" & startdate & "'"
            'データを取得する
            SQLAdapter.SelectCommand = Command
            DataSet.Clear()
            SQLAdapter.Fill(DataSet)
            'リストボックスに列別名scheduleを表示できるようにする。
            Me.shortscheduleListBox.DisplayMember = "schedule"
            'リストボックスにShortテーブルのデータを連結する。
            Me.shortscheduleListBox.DataSource = DataSet.Tables(DataSet.Tables(0).ToString)

        Catch ex As Exception
            MsgBox("エラー")
        End Try

            End Sub

これがカレンダーをクリックしたらその日付の予定を表示させるメソッドです。
複数行表示させなければならないのでDataSetを使いました。


Private Sub shortupdateButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles shortupdateButton.Click
                Dim UpDateForm As UpdateDate = New UpdateDate()

        Dim DataSet As DataSet = DirectCast(Me.shortscheduleListBox.DataSource, DataSet)


        Dim Row As DataRow
        Dim Value As String

        Value = Row("startdate")
        UpDateForm.startdateTextBox.Text = Value
        UpDateForm.ShowDialog()

これが途中ですが修正ボタンプロシージャになります。
まず、StartDateだけでも修正画面に表示させようと思い中途半端ですが、こんな感じです。

shortscheduleListBoxのDataSourceからDataSetを取得し、startdate列を指定し、UpDateForm(修正画面)のstartTextに代入させ、ShowDialogで開くという風に記述しました。

これだと、行の指定がないからかInvalidCastException 例外がでます。

この先どう記述していいか分からない状態です。



・どうしたいか
選択した予定を修正画面に移して行きたいので、どういった感じで記述するのかを教えていただきたいです。




長文になり、また至らぬ点もあるかもしれませんが、ご指導お願いいたします。