|
■No93981 (ぽむ さん) に返信
> 結果的には同じように使えるのですが、どちらのほうが早い、推奨などが分からず、
> どちらを使うべきか判断できません。
ユーザーが抽出条件を指定して結果を DataGridView にユーザーに表示というような
ユーザー操作が絡む場合は、早い/遅いはあまり気にする必要はなく、どちらがより
簡単かつ問題なく実装できるかで考える方がよさそうな気がします。
例えば、DataTable ⇔ BindingSource ⇔ DataGridView という定番の構成で、ユー
ザー入力で絞り込む場合、DataTable の Select メソッドでは問題があるので、
DataView を取得してその RowFilter プロパティを使うのが正解という例もありま
した。
その時のサンプルコードをアップしておきます。質問者さんのケースでは関係ない話
かもしれませんが、ご参考まで。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form3 : Form
{
public Form3()
{
InitializeComponent();
}
private void productsBindingNavigatorSaveItem_Click(object sender, EventArgs e)
{
this.Validate();
this.productsBindingSource.EndEdit();
this.tableAdapterManager.UpdateAll(this.northwindDataSet);
}
private void Form3_Load(object sender, EventArgs e)
{
// TODO: このコード行はデータを 'northwindDataSet.Products' テーブルに読み込みます。
// 必要に応じて移動、または削除をしてください。
this.productsTableAdapter.Fill(this.northwindDataSet.Products);
}
// 上のコードまではデザイナで自動生成される
// 検索用の TextBox と Button を追加し、Button の Click イベントのハンドラを以下のようにする。
private void button1_Click(object sender, EventArgs e)
{
if (!String.IsNullOrEmpty(this.textBox1.Text))
{
NorthwindDataSet.ProductsDataTable table = this.northwindDataSet.Products;
//NorthwindDataSet.ProductsRow[] rows =
// (NorthwindDataSet.ProductsRow[])table.Select("ProductName LIKE '%" + this.textBox1.Text + "%'");
//this.productsBindingSource.DataSource = rows;
// 上記のように NorthwindDataSet.ProductsRow[] を DataSource に設定した場合は
// ProductsRow クラスに定義されているプロパティの get アクセサを使って
// ProductsDataTable からデータを取得するので、そのデータが DBNull の場合キャスト
// に失敗して StrongTypingException がスローされるので注意。
// 以下のように DataView を取得して、その RowFilter プロパティに設定するのが正解。
table.DefaultView.RowFilter = "ProductName LIKE '%" + this.textBox1.Text + "%'";
this.productsBindingSource.DataSource = this.northwindDataSet.Products;
}
else
{
// 元に戻す場合
NorthwindDataSet.ProductsDataTable table = this.northwindDataSet.Products;
table.DefaultView.RowFilter = "";
// このコードは無くても OK
//this.productsBindingSource.DataSource = this.northwindDataSet.Products;
}
}
}
}
|