2016-09-10 28 views
1

せずに、私はC#SQLiteのデータグリッドビュー上の検索を行いたいが、私はDataGridViewのためバインディングソースを持っていない方。私はDatagridviewに次のコードを入力します:C# - 検索とフィルターのDataGridViewでのBindingSource

SQLiteConnection conn = new SQLiteConnection("Data Source=gasstation.sqlite;Version=3"); 

dt = new DataTable(); 
SQLiteCommand cmd = new SQLiteCommand("SELECT ID,fname, lname, nationalCode," + 
     personalCode, phone ,address, datetime(dateEnter) as dateEnter FROM Workers", conn); 
conn.Open(); 
SQLiteDataAdapter da = new SQLiteDataAdapter(cmd); 

da.Fill(dt);    

SQLiteDataReader read = cmd.ExecuteReader(); 
DateTime date; 
PersianCalendar pc = new PersianCalendar();     
while (read.Read()) 
{ 
    date = read.GetDateTime(7); 
    string datePC = string.Format("{0}/{1}/{2}", pc.GetYear(date), 
            pc.GetMonth(date), pc.GetDayOfMonth(date)); 

    dgvUsers.Rows.Add(new object[] { 
     read.GetValue(0), 
     read.GetValue(1), 
     read.GetValue(2), 
     read.GetValue(3), 
     read.GetValue(4), 
     read.GetValue(5), 
     read.GetValue(6), 
     datePC }); 
    } 
    read.Close(); 
    conn.Close(); 
} 

テキストボックスのテキスト変更イベントでデータグリッドビューで検索とフィルタリングを行う方法。

私はStackOverflowのすべての質問と回答を見ましたが、私の問題に正解しません。

+0

なぜBindingSourceを作成しないのですか? – TaW

+0

@TaW:このコードでBindingSourceを作成する方法はありません。 –

+0

私の答えを見てください。 IBindingListを実装するオブジェクトを使用する必要があります。あなたは既にDataTableを持っているので、それは当然の選択です。これを行う方法と計算カラムをテーブルに補足する方法については、私の答えを見てください! – TaW

答えて

1

あなたのコードはちょっと混乱しています。

最初に にすべてのデータを入力してください。DataAdapterと表示されます。しかしそしてあなたはをもう一度DataReaderに読んで、コードでDataGridViewに記入してください。

これは必須ではありません。読者とそれが入っているループを忘れて! DataTableにデータが含まれている場合

あなたがそのテーブルにDGVをバインドすることができます。

dgvUsers.DataSource = dt; 

直接あなたがが、並べ替えたりフィルタすることはできませんバインディング。したがって、BindingSourceを作成し、それがDGVのDataSource作る方が良いです:

BindingSource bs = new BindingSource(dt, ""); 

二番目のパラメータに注意してください。私たちはBindingSourceのデータソースとして単一のテーブルを使用しているので、それは、空です。 DataSetを使用した場合は、TableNameを入力していました。 TableNameプロパティは設定されていません。

dgvUsers.DataSource = bs; 

、必要に応じて最終的に我々はSortFilterプロパティを設定することができます:そう今、私たちはBindingSourceを介してデータにDGVをバインドすることができますのは、dt = new DataTable("someTableName");

にインスタンス化を変更してみましょう、そうした方が良いです。私たちは多分このように、BindingSourceに戻ってキャストすることができますいくつかの他のコントロールから

private void textBox_lastName_TextChanged(object sender, EventArgs e) 
{ 
    BindingSource bs = dgvUsers.DataSource as BindingSource; 

    if (textBox_lastName.Text == "") bs.RemoveFilter(); 
    else bs.Filter = "lname like '%" + textBox_lastName.Text + "%'"; 
} 

私は、ループ内で使用すると、フォーマットされた日付フィールドを作成していることに注意してください。私はそれが最初の場所でそのループを作成する理由だと思う..?しかし、それをDataTableに追加することもできます。もちろん、最良の方法は、いつものように、あなたが望む値を選択し、DBMSにすべての作業をさせることです。

しかし、あなたは、あなたが達成するためのSQL関数を信用していない非常に特別なものをしたい場合は、そのPersianCalendarクラスを使用するように、あなたがあなたのSELECTダミーフィールドを追加することができます。

SQLiteCommand cmd = new SQLiteCommand("SELECT ID,fname, lname ,nationalCode, " + 
     "personalCode, phone, address, datetime(dateEnter) as dateEnter " + 
     "\"\" as pcDate FROM Workers", conn); 

。クーゼの

DateTime date; 
PersianCalendar pc = new PersianCalendar(); 

foreach(DataRow row in dt.Rows) 
{ 
    date = row.Field<DateTime>("dateEnter"); 
    string datePC = string.Format("{0}/{1}/{2}", 
        pc.GetYear(date), pc.GetMonth(date), pc.GetDayOfMonth(date)); 
    row.SetField<string>("pcDate", datePC); 
} 

あなたが今DVGからdateEnter列を非表示にする場合があります:

.ANDテーブルを充填した後、特別な値とそのダミーフィールドを埋めます
dgvUsers.Columns["dateEnter"].Visible = false; 
+0

ありがとうございます。これは最高の答えです。 –

+0

pcite from FROM Workers "SQLiteCommandで、" SQLiteCommand cmd = new SQLiteCommand( "SELECT ID、fname、lname、nationalCode、" + "パーソナルコード、電話番号、住所、日時(dateEnter)は" + " 、conn); 'エラー: 'データベーススキーマが変更されました。 "":構文エラー。 –

+0

私は '' SQLiteCommand'を設定しました: '' SQLiteCommand'を設定しました: '' SQLiteCommand' = new SQLiteCommand( "SELECT ID、fname、lname、nationalCode、phone、address、datetime(dateEnter)as dateEnter、 –