PDA

View Full Version : سوال: فیلتر کردن رکوردهای DataGrid بر اساس عبارت وارد شده در TextBox



mehran63
سه شنبه 02 آذر 1389, 13:07 عصر
سلام
دوستان عزیز میخوام طوری تو فرمم سرچ داشته باشم که داخل تکست هر حرفی که وارد میشه تمام فیلدهایی که آن حرف را دارند رکوردشان در data grid ظاهر بشه و با هر حرفی که اضافه میشه رکوردها با توجه به حرف اضافه شده در تکست باکس تطبیق پیدا کنند(به قولی سرچ لحظه ای) من یک تازه کار هستم اگر یک نمونه کد هم بزارید ممنون میشم
در ضمن پایگاه داده من sql server 2008 است

hadi-z
سه شنبه 02 آذر 1389, 13:19 عصر
سلام



privatevoid textbox_textchanged(object sender, EventArgs e)


{


//this.Close();


DataTable dt = (DataTable)this.dataGrid1.DataSource;


DataView dv = newDataView(dt);


dv.RowFilter = "Nume like " + "'%" + textbox.Text + "%'";


dataGrid1.DataSource = dv;


}

mehran63
سه شنبه 02 آذر 1389, 13:39 عصر
متشکر دوست عزیز ولی خط زیر در Run Time پیغام خطا میده (Cannot find column [Nume]i ) فیلد مورد نظر را در کجای کد باید مشخص کنم



dv.RowFilter = "Nume like " + "'%" + searchTextBox.Text + "%'";

hadi-z
سه شنبه 02 آذر 1389, 15:26 عصر
اون Nume که من نوشتم همون اسم فیلده

اون ارور هم میگه که column ی به نام Nume پیدا نمیکنه

dr_jacky_2005
سه شنبه 02 آذر 1389, 15:31 عصر
سلام
دوستان عزیز میخوام طوری تو فرمم سرچ داشته باشم که داخل تکست هر حرفی که وارد میشه تمام فیلدهایی که آن حرف را دارند رکوردشان در data grid ظاهر بشه و با هر حرفی که اضافه میشه رکوردها با توجه به حرف اضافه شده در تکست باکس تطبیق پیدا کنند(به قولی سرچ لحظه ای) من یک تازه کار هستم اگر یک نمونه کد هم بزارید ممنون میشم
در ضمن پایگاه داده من sql server 2008 است
اینهو فرفره گرید رو فیلتر میکنه.
این رو توو textChange از تکس باکس بنویس:



string text = txtboxFilt.Text;
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
if(dataGridView1.Rows[i].Cells[0].Value != null)
if (dataGridView1.Rows[i].Cells[0].Value.ToString().IndexOf(text.ToString())!= 0)
{
dataGridView1.Rows[i].Visible = false;
}
//else
//{
// dataGridView1.Rows[i].Visible = true;
//}
}
if (txtboxFilt.Text == "")
{
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
dataGridView1.Rows[i].Visible = true;
}
}

ایمان مدائنی
سه شنبه 02 آذر 1389, 15:35 عصر
دوست عزيز من يك نمونه در لين زير گذاشتم
همينه كه ميخواهي
http://www.barnamenevis.org/forum/showpost.php?p=1148802&postcount=615

hadi-z
سه شنبه 02 آذر 1389, 15:41 عصر
اینهو فرفره گرید رو فیلتر میکنه.
این رو توو textChange از تکس باکس بنویس:



string text = txtboxFilt.Text;
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
if(dataGridView1.Rows[i].Cells[0].Value != null)
if (dataGridView1.Rows[i].Cells[0].Value.ToString().IndexOf(text.ToString())!= 0)
{
dataGridView1.Rows[i].Visible = false;
}
//else
//{
// dataGridView1.Rows[i].Visible = true;
//}
}
if (txtboxFilt.Text == "")
{
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
dataGridView1.Rows[i].Visible = true;
}
}




دوست عزیز این روش درسته ولی فقط سطرهای گرید رو پنهان یا نمایان میکنه
اگه بعدا بخوان از DataSource فیلتر شده استفاده کنن که این روش جواب نمیده

ایمان مدائنی
سه شنبه 02 آذر 1389, 15:47 عصر
دوستان نيازي به حلقه نيست
چرا الكي سرعت برنامه خودتون رو پايين مياريد
متد DataView اينكارو ميكنه
فقط كافيه متد Fillter رو صدا بزندي
نمونه كه گذاشتم رو ببينيد
http://www.barnamenevis.org/forum/sh...&postcount=615

hadi-z
سه شنبه 02 آذر 1389, 15:56 عصر
دوستان نيازي به حلقه نيست
چرا الكي سرعت برنامه خودتون رو پايين مياريد
متد DataView اينكارو ميكنه
فقط كافيه متد Fillter رو صدا بزندي
نمونه كه گذاشتم رو ببينيد
http://www.barnamenevis.org/forum/sh...&postcount=615

البته من از حلقه استفاده نکردم
و با نظر و نمونه برنامه شما موافقم

mehran63
سه شنبه 02 آذر 1389, 18:24 عصر
با تشکر از دوستان عزیز
iman_lovely666 (http://barnamenevis.org/forum/member.php?u=125609) جان اون لینکی که گذاشتی خطا میده

ایمان مدائنی
سه شنبه 02 آذر 1389, 21:30 عصر
اينم لينك
http://www.barnamenevis.org/forum/showpost.php?p=1148802&postcount=615

hakelberfin
سه شنبه 02 آذر 1389, 22:12 عصر
این برنامه کاری که شما میخواین رو انجام میده

mehran63
چهارشنبه 10 آذر 1389, 12:18 عصر
آقای iman_lovely666 (http://barnamenevis.org/member.php?125609-iman_lovely666) اون سورسی که گذاشتید رو انجام دادم
private void searchTextBox_TextChanged(object sender, EventArgs e)
{

string name = searchTextBox.Text;
dv.RowFilter = string.Format("fn Like '{0}%'", name);
dataGridView1.DataSource = dv;
}
}و در قسمت public partial class دستور DataView dv; را هم نوشتم

ولی وقتی در تکست باکس هر حرفی را وارد میکنم در خطی که dv.RowFilter = string.Format("fn Like '{0}%'", name); وجود دارد پیغام Object reference not set to an instance of an object. را دارم که عکس آن را در پایین گذاشتم

62993

hadi-z
چهارشنبه 10 آذر 1389, 15:15 عصر
سلام
فکر کنم اسم فیلدت رو درست وارد نکردی
اسم فیلدی که باید بر اساس اون table ات فیلتر بشه چیه؟

mehran63
پنج شنبه 11 آذر 1389, 09:33 صبح
اسم فیلدم fn هستش تو سورسی که گذاشتم مشخصه

dv.RowFilter = string.Format("fn Like '{0}%'", name);
در پایین کل سورس را گذاشتم


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace ConnectioinToSql2008
{
public partial class formConnectioinToSql2008 : Form
{
DataView dv;
SqlConnection conn = new SqlConnection();
SqlCommand cmd = new SqlCommand();
//SqlDataReader rd;
SqlDataAdapter da = new SqlDataAdapter();
DataSet ds = new DataSet();

public formConnectioinToSql2008()
{
InitializeComponent();
}

private void formConnectioinToSql2008_Load(object sender, EventArgs e)
{
string str = @"server=Mehran;" + "database=for_work;" + "Integrated Security=True";
conn.ConnectionString = str;
//conn.Open();

cmd.Connection = conn;
cmd.CommandText = @"select * from tinfo";
da.SelectCommand = cmd;
//rd = com.ExecuteReader();
//ds.Clear();
da.Fill(ds);
dataGridView1.DataSource = ds.Tables[0];
//rd.Close();
//conn.Close();
} // end method formConnectioinToSql2008_Load

private void addButton_Click(object sender, EventArgs e)
{
//cmd.CommandText = "insert into tinfo(code,fn,ln,jens) valuse ('"
//+ fNTextBox.Text + "','" + lNTextBox.Text + "',";
cmd.CommandText = "insert into tinfo(code,fn,ln,jens) values (@code,@fn,@ln,@jens)";
cmd.Parameters.AddWithValue("@fn", fNTextBox.Text);
cmd.Parameters.AddWithValue("@ln", lNTextBox.Text);
cmd.Parameters.AddWithValue("@code", codeTextBox.Text);
cmd.Parameters.AddWithValue("@jens", jensTextBox.Text);
foreach(Control sayre in this.Controls)
{
if (sayre is TextBox)
(sayre as TextBox).Clear();
}
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
}

private void codeTextBox_KeyPress(object sender, KeyPressEventArgs e)
{
//faghat addad migire
if ((e.KeyChar != 8) && (e.KeyChar != 13))
e.Handled = !char.IsDigit(e.KeyChar);
// hich klidi gheyr az adad ruye keybord karnemikone
//if (e.KeyChar < '0' || e.KeyChar > '9')
// e.Handled = true;
}

private void searchTextBox_TextChanged(object sender, EventArgs e)
{

string name = searchTextBox.Text;
dv.RowFilter = string.Format("fn Like '{0}%'", name);

}
}
}

alireza_wills
پنج شنبه 11 آذر 1389, 12:27 عصر
یک خط کد داره اینو بنویسی حله.bindingsource تو با مشخصه filter بنویس:



private void txtSchName_TextChanged(object sender, EventArgs e)
{
finsertBindingSource1.Filter = "Fname Like '%" + txtSchName.Text + "%'";
}

mehran63
یک شنبه 14 آذر 1389, 14:08 عصر
این کار رو انجام دادم ولی وقتی کلمه ای که داخل فیلد هستش رو تو تکست باکس وارد میکنم هیچ عکس العملی نشون نمیده