連載: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メソッドを呼び出し、編集画面(ダイアログ画面)を表示する。
次のページでは、そのダイアログ画面の実装内容を説明する。
業務アプリInsider 記事ランキング
本日
月間