連載:Windowsフォーム開発入門【Visual Studio 2010対応】

リモート・データ活用術〜SQL Server編〜

初音 玲
2011/02/09

タイトル一覧画面(メイン画面)を作成

 メインとなるタイトル一覧画面のUIは新規にデザインしている。次の画面はそのUIデザインの例である。

図14 タイトル一覧画面のUIデザイン

 Windowsフォームの一番上にはタイトル検索用のキーワード入力欄と[検索]ボタンを配置し、その下に一覧表示用のDataGridViewコントロール、一番下にStatusStripコントロールを配置している。

 (実行時において)DataGridViewコントロールを右クリックされたときに、編集用のコンテキスト・メニューを表示するためにContextMenuStripコントロールも使用している。

メイン画面表示時の実行コード

 Windowsフォームでは、メイン画面が表示されるまでにいくつかのイベントが発行される。サンプルでは、メイン画面表示前のLoadイベントでメイン画面上の各コントロールの内容をクリアし、メイン画面表示直後のShownイベントでログイン画面を表示している。具体的なコードは下記のとおり。

Private Sub Me_Load(sender As Object,
                    e As System.EventArgs) _
        Handles Me.Load
  Me.Result_DataGridView.AutoGenerateColumns = False
  Call DisplayClear()
End Sub

Private Sub DisplayClear()
  Me.Search_TextBox.Text = String.Empty
  Me.Result_DataGridView.DataSource = Nothing
  Me.Message_ToolStripStatusLabel.Text = String.Empty
End Sub

Private Sub Me_Shown(sender As System.Object,
                     e As System.EventArgs) _
         Handles MyBase.Shown
  Using _form As New Login_Form
    If _form.ShowDialog(Me) = DialogResult.OK Then
      Me.UserID = _form.UserID
      Me.Password = _form.Password
    Else
      Me.Close()
    End If
  End Using
End Sub
private void Me_Load(object sender, EventArgs e)
{
  this.Result_DataGridView.AutoGenerateColumns = false;
  DisplayClear();
}

private void DisplayClear()
{
  this.Search_TextBox.Text = String.Empty;
  this.Result_DataGridView.DataSource = null;
  this.Message_ToolStripStatusLabel.Text = String.Empty;
}

private void Me_Shown(object sender, EventArgs e)
{
  using (Login_Form _form = new Login_Form())
  {
    if (_form.ShowDialog(this) == DialogResult.OK)
    {
      this.UserID = _form.UserID;
      this.Password = _form.Password;
    }
    else
    {
      this.Close();
    }
  }
}
リスト3 タイトル一覧画面(メイン画面)の表示時に実行されるコード例(上:VB、下:C#)

[検索]ボタンクリック時の実行コード

 [検索]ボタンをクリックしたときには、SQL Serverからデータを取得してタイトル一覧画面に表示する。そのコードは下記のようになる。

Private Sub Search_Button_Click(sender As System.Object,
                                e As System.EventArgs) _
              Handles Search_Button.Click
  Me.Cursor = Cursors.WaitCursor
  Try
    Using _proc As New DataAccessClass
      Me.Result_DataGridView.DataSource = _proc.GetTitleDs(Me.UserID,
                                                           Me.Password,
                                                           Me.Search_TextBox.Text.Trim)
      Me.Result_DataGridView.DataMember = "TitleList"
    End Using
  Catch ex As Exception
    MessageBox.Show(ex.Message, Me.Text)
    Me.Message_ToolStripStatusLabel.Text = ex.Message
  Finally
    Me.Cursor = Cursors.Default
  End Try
End Sub
private void Search_Button_Click(object sender, EventArgs e)
{
  this.Cursor = Cursors.WaitCursor;
  try
  {
    using (DataAccessClass _proc = new DataAccessClass())
    {
      this.Result_DataGridView.DataSource = _proc.GetTitleDs(this.UserID,
        this.Password,
        this.Search_TextBox.Text.Trim());
      this.Result_DataGridView.DataMember = @"TitleList";
    }
  }
  catch (Exception ex)
  {
    MessageBox.Show(ex.Message, this.Text);
    this.Message_ToolStripStatusLabel.Text = ex.Message;
  }
  finally
  {
    this.Cursor = Cursors.Default;
  }
}
リスト4 [検索]ボタンのClickイベント・プロシージャに記述するコード例(上:VB、下:C#)

 実際にSQL Serverからデータを取得するためのコード(=上記のコードでは_procオブジェクトのGetTitleDsメソッド)は、DataAccessClassクラスとしてWindowsフォーム・クラスのファイルとは別のファイルに定義している。(1つのプロジェクトの中であっても)このようにWindowsフォーム・クラスからデータ・アクセス部分を別クラスとして切り出しておくことで、プログラムの見通しは確実に向上する。また、接続先を変更したいときも修正対象のファイルが判断しやすくなり、対応しやすい。

 DataAccessClassクラスのGetTitleDsメソッドのコード内容は下記のとおり。

Friend Function GetTitleDs(ByVal userID As String,
                           ByVal password As String,
                           ByVal keyword As String) As DataSet
  Dim ds As New DataSet
  Using _cn As New SqlClient.SqlConnection
    _cn.ConnectionString = String.Format(My.Settings.ConnectonString,
                                         userID,
                                         password)
    _cn.Open()
    Using _cmd As New SqlCommand
      _cmd.Connection = _cn
      _cmd.CommandText = "SELECT * " &
                         "FROM titles " &
                         "WHERE title LIKE @Title"
      _cmd.Parameters.Add(New SqlClient.SqlParameter("Title", "%" & keyword & "%"))
      Using _da As New SqlDataAdapter
        _da.SelectCommand = _cmd
        _da.Fill(ds, "TitleList")
        ds.Tables("TitleList").PrimaryKey =
          New DataColumn() {ds.Tables("TitleList").Columns("title_id")}
      End Using
    End Using
  End Using
  Return ds
End Function
internal DataSet GetTitleDs(String userID, String password, String keyword)
{
  DataSet ds = new DataSet();
  using (SqlConnection _cn = new SqlConnection())
  {
    _cn.ConnectionString =
      String.Format(WinFormSQLCs.Properties.Settings.Default.ConnectonString,
      userID,
      password);
    _cn.Open();
    using (SqlCommand _cmd = new SqlCommand())
    {
      _cmd.Connection = _cn;
      _cmd.CommandText = @"SELECT * " +
                          "FROM titles " +
                          "WHERE title LIKE @Title";
      _cmd.Parameters.Add(new SqlParameter(@"Title", @"%" + keyword + @"%"));
      using (SqlDataAdapter _da = new SqlDataAdapter())
      {
        _da.SelectCommand = _cmd;
        _da.Fill(ds, "TitleList");
        ds.Tables["TitleList"].PrimaryKey =
          new DataColumn[] { ds.Tables["TitleList"].Columns["title_id"] };
      }
    }
  }
  return ds;
}
リスト5 検索時のADO.NETデータ・アクセスのコード例(上:VB、下:C#)

 上記のコードで示されるように、ADO.NETによるデータ・アクセスの基本的なコードは、下記の手順になる。

(1) SqlConnectionクラスを使ってSQL Serverに接続
(2) SqlCommandクラスを使って、「title LIKE @Title」というLIKE演算子とパラメータ(=WHERE句)によるあいまい検索を行うSELECT文を作成
(3) SqlParameterクラスで「@Title」に「%<キーワード>%」を設定
(4) SqlDataAdapterクラスでSELECT文を実行して、データセットに結果を格納
(5) データセットのテーブルに主キー(=PrimaryKeyプロパティの値)を設定

DataGridViewコントロールを右クリックしたときの実行コード

 コンテキスト・メニューを表示したいコントロールのContextMenuStripプロパティにContextMenuStripコントロールを指定すれば、コードを何も記述しなくても、右クリックで表示されるコンテキスト・メニューを実装できる。しかし、DataGridViewコントロールで行が選択されているときだけコンテキスト・メニューを表示したいような場合は、CellMouseDownイベントで明示的に表示する必要がある。

 次のコードは、MouseDownイベント・プロシージャの実装例である。

Private Sub Result_DataGridView_CellMouseDown(sender As System.Object,
                                              e As DataGridViewCellMouseEventArgs) _
                      Handles Result_DataGridView.CellMouseDown
  If e.Button = MouseButtons.Right Then
    If Me.Result_DataGridView.Rows.Count > 0 AndAlso
      Me.Result_DataGridView.SelectedRows.Count > 0 Then
      Edit_ContextMenuStrip.Enabled = True
    Else
      Edit_ContextMenuStrip.Enabled = False
    End If
    Edit_ContextMenuStrip.Show(New Point(Cursor.Position.X,
                                         Cursor.Position.Y))
  End If
End Sub

Private Sub Edit_ToolStripMenuItem_Click(sender As Object,
                                         e As System.EventArgs) _
                   Handles Edit_ToolStripMenuItem.Click
  If Me.Result_DataGridView.Rows.Count > 0 AndAlso
    Me.Result_DataGridView.SelectedRows.Count > 0 Then
    Dim row As DataGridViewRow = Me.Result_DataGridView.SelectedRows(0)
    Using _form As New Edit_Form
      _form.ShowDialog(Me,
                       UserID,
                       Password,
                       row.Cells("TitleID_TextBox").Value.ToString()) = DialogResult.OK Then
    End Using
  End If
End Sub
private void Result_DataGridView_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
  if (e.Button == MouseButtons.Right)
  {
    if (this.Result_DataGridView.Rows.Count > 0 &&
      this.Result_DataGridView.SelectedRows.Count > 0)
    {
      Edit_ContextMenuStrip.Enabled = true;
    }
    else
    {
      Edit_ContextMenuStrip.Enabled = false;
    }
    Edit_ContextMenuStrip.Show(new Point(Cursor.Position.X, Cursor.Position.Y));
  }
}

private void Edit_ToolStripMenuItem_Click(object sender, EventArgs e)
{
  if (this.Result_DataGridView.Rows.Count > 0 &&
    this.Result_DataGridView.SelectedRows.Count > 0)
  {
    DataGridViewRow row  = this.Result_DataGridView.SelectedRows[0];
    using (Edit_Form _form = new Edit_Form())
    {
      _form.ShowDialog(this,
                       UserID,
                       Password,
                       (string)this.Result_DataGridView.SelectedRows[0].Cells["TitleID_TextBox"].Value) == DialogResult.OK)
    }
  }
}
リスト6 タイトル一覧(=DataGridViewコントロール)で右クリックしたときのMouseDownイベント・プロシージャのコード例(上:VB、下:C#)

 ContextMenuStripコントロールの[編集]メニューをクリックすれば、Clickイベントが発生してEdit_ToolStripMenuItem.Clickイベント・プロシージャが呼び出される。上記のコードでは、そのコード例も示している。そのイベント・プロシージャ内では(VBの場合)、

row.Cells("TitleID_TextBox").Value.ToString()

というコードで、選択行のタイトルID(=Pubsデータベースのtitlesテーブルのtitle_idフィールドの値)を第3パラメータに設定してShowDialogメソッドを呼び出し、編集画面(ダイアログ画面)を表示する。

 次のページでは、そのダイアログ画面の実装内容を説明する。


 INDEX
  [連載]Windowsフォーム開発入門【Visual Studio 2010対応】
  リモート・データ活用術〜SQL Server編〜
    1.SQL Server Expressの設定
    2.画面遷移/スプラッシュ・スクリーン/ログイン画面
  3.タイトル一覧画面(メイン画面)
    4.編集画面(ダイアログ画面)
    5.最終仕上げ

インデックス・ページヘ  「Windowsフォーム開発入門」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH