PDA

View Full Version : سوال: نمایش نتیجه جستجوی انجام شده روی dataset در datagridview



csharpcollegian
چهارشنبه 12 اسفند 1394, 09:41 صبح
سلام وقت به خیر
دوستان من دارم یک برنامه ویندوزی تحت شبکه می نویسم که داخلش یک بخش جستجو قرار دادم که عملیات جستجو رو به ازای ورود هر حرف در تکست باکس انجام میده :

private void txtSearch_TextChanged(object sender, EventArgs e)
{
Searching...
}
در پروژه های گذشتم کوئری جستجو رو مستقیما روی دیتابیس اعمال می کردم و نتیجه رو در دیتاگریدویو نمایش میدادم
و چون برنامه تک کاربره بود، دفعات اتصال بالا به دیتابیس مشکلی ایجاد نمی کرد (به ازای ورود هر حرف توسط کاربر، یک بار اتصال به دیتابیس و اعمال کوئری جستجو)
اما خب همونطور که خودتون می دونید این تکنیک، از لحاظ فنی ارزش بسیار پایینی داره...
در پروژه ی جدیدم چون برنامه چند کاربره و تحت شبکه هست میخوام از روش اصولی تر که خواندن یک بار اطلاعات از دیتابیس و اعمال کوئری جستجو روی دیتاست هست استفاده کنم (دوستان اگر تکنیک بهتری مدنظرتون هست مطرح کنید لطفا)
اما مشکلم اینجاست که بعد از اعمال جستجو روی دیتاست و گرفتن نتیجه در یک آرایه ی رکورد، نمی تونم اون رو در دیتا گرید ویو نمایش بدم. از تکنیک های زیر استفاده کردم ولی به نتیجه نرسیدم
اول سعی کردم به صورت دستی یه جدول به دیتاست اضافه کنم و رکوردها رو به اون جدول اضافه کنم که نشد :



private void txtSearch_TextChanged(object sender, EventArgs e)
{
DataRow[] resultRows = ds.Tables["tblVisitant"].Select("Name Like '%S%' ");
DataTable dt = new DataTable("tblSearch");
dt = ds.Tables["tblVisitant"].Clone();
ds.Tables.Add(dt);
foreach (DataRow row in resultRows)
ds.Tables["tblSearch"].Rows.Add(row);
dgvMain.DataBindings.Clear();
dgvMain.DataBindings.Add("DataSource", ds, "tblSearch");
}
خطایی که در رابطه با کد بالا داد :

139375



بعد سعی کردم نتیجه رو در یک جدول مستقل بریزم باز هم نشد :



private void txtSearch_TextChanged(object sender, EventArgs e)
{
DataRow[] resultRows = ds.Tables["tblVisitant"].Select("Name Like '%س%' ");
DataTable dt = new DataTable("tblSearch");
dt = ds.Tables["tblVisitant"].Clone();
foreach (DataRow row in resultRows)
dt.Rows.Add(row);
dgvMain.DataSource = dt;
}
خطایی که در رابطه با کد بالا داد :


139376



دوستان عزیز ممنون میشم در این رابطه من رو راهنمایی کنید و ایراد روش های بالا رو هم توضیح بدید
خیلی ممنون

rezashaban
چهارشنبه 12 اسفند 1394, 10:46 صبح
سلام دوست من
خب فیلتر رو با استفاده از کد زیر روی گرید انجاک بده:


for (int item = 0; item < dataGridView1.Rows.Count; item++)
{
if (!dataGridView1.Rows[item].Cells[1].Value.ToString().Contains(textBox1.Text))
dataGridView1.Rows[item].Visible = false;
else
dataGridView1.Rows[item].Visible = true;
}

csharpcollegian
چهارشنبه 12 اسفند 1394, 11:07 صبح
سلام دوست من
خب فیلتر رو با استفاده از کد زیر روی گرید انجاک بده:


for (int item = 0; item < dataGridView1.Rows.Count; item++)
{
if (!dataGridView1.Rows[item].Cells[1].Value.ToString().Contains(textBox1.Text))
dataGridView1.Rows[item].Visible = false;
else
dataGridView1.Rows[item].Visible = true;
}


ممنون دوست عزیز راه خوبیه ولی شرطی که اینجا گذاشتم یک مثال سادست، من میخوام از شرط های پیچیده تری استفاده کنم که واسه اعمال اونها نیاز به کار با خود دیتاست دارم

rezashaban
چهارشنبه 12 اسفند 1394, 11:12 صبح
مثلا چه شرطهایی؟ خود گرید هم مثل دیتاستش هست تقریبا

csharpcollegian
چهارشنبه 12 اسفند 1394, 11:32 صبح
مثلا چه شرطهایی؟ خود گرید هم مثل دیتاستش هست تقریبا

شرط های بازه زمانی، شرط های محاسباتی و ...

rezashaban
چهارشنبه 12 اسفند 1394, 12:14 عصر
شرط های بازه زمانی، شرط های محاسباتی و ...
خب این موارد هم قابل اعمال هستش با همین روش

csharpcollegian
چهارشنبه 12 اسفند 1394, 12:59 عصر
خب این موارد هم قابل اعمال هستش با همین روش

بازم نمیشه چون قراره بعد از اعمال کوئری جستجو، تمام کنترل های دیگه ی فرم که به دیتاست بایند شدن تاثیر بپذیرن، بایستی حتما دیتاست باشه...

rezashaban
چهارشنبه 12 اسفند 1394, 13:19 عصر
خب از این کد استفاده کن


dt.AsEnumerable().Where(میتونی از لامیدا استفاده کنی)

csharpcollegian
چهارشنبه 12 اسفند 1394, 13:31 عصر
خب از این کد استفاده کن


dt.AsEnumerable().Where(میتونی از لامیدا استفاده کنی)


آقا رضا مشکل من اعمال کوئری نیست، من نمی تونم بعد از اجرای کوئری نتیجه رو داخل یک دیتاست قرار بدم همین !
یه نگاه به کدهام بندازید....

rezashaban
چهارشنبه 12 اسفند 1394, 13:52 عصر
خب از این کد استفاده کن


var dt = new DataTable()
{
Columns =
{
"name"
},
Rows =
{
"ali", "reza", "hasan"
}
};
var ds = new DataSet();
var dt1 = new DataTable();
dt1.TableName = "test";
ds.Tables.Clear();
ds.Tables[0].Rows.Add(dt.Select("select *...").ToList());

csharpcollegian
چهارشنبه 12 اسفند 1394, 14:23 عصر
خب از این کد استفاده کن


var dt = new DataTable()
{
Columns =
{
"name"
},
Rows =
{
"ali", "reza", "hasan"
}
};
var ds = new DataSet();
var dt1 = new DataTable();
dt1.TableName = "test";
ds.Tables.Clear();
ds.Tables[0].Rows.Add(dt.Select("select *...").ToList());


جواب نمیده این کد، ارور داره :

Cannot implicitly convert type 'System.Data.DataRow' to 'System.Data.DataRow[]

csharpcollegian
چهارشنبه 12 اسفند 1394, 14:30 عصر
دوستان کسی نیست که بتونه این مشکل رو حل کنه ؟
خیلی ساده تر مشکلم رو مطرح کنم من فقط دنبال راهی هستم که بشه یک آرایه از جنس رکورد رو که نتیجه ی جستجوم از یک دیتاست داخلش قرار گرفته :

DataRow[] resultRows = ds.Tables["tblVisitant"].Select(.....);
رو وارد یک جدول جدید کنم و اون جدول جدید رو به دیتاستم اضافه کنم، همین !
ممنون میشم دوستان پاسخ بدن

khokhan
چهارشنبه 12 اسفند 1394, 15:18 عصر
دوستان کسی نیست که بتونه این مشکل رو حل کنه ؟
خیلی ساده تر مشکلم رو مطرح کنم من فقط دنبال راهی هستم که بشه یک آرایه از جنس رکورد رو که نتیجه ی جستجوم از یک دیتاست داخلش قرار گرفته :

DataRow[] resultRows = ds.Tables["tblVisitant"].Select(.....);
رو وارد یک جدول جدید کنم و اون جدول جدید رو به دیتاستم اضافه کنم، همین !
ممنون میشم دوستان پاسخ بدن

می تونی از dataview استفاده کنی ....!!!! نه؟؟؟ نمی شه؟؟؟!!! :لبخند:

private void textBox1_TextChanged(object sender, EventArgs e)
{
DataView dv = new DataView(table);
dv.RowFilter = "Name like '%" + textBox1.Text + "%'";
dataGridView1.DataSource = dv;
}

csharpcollegian
چهارشنبه 12 اسفند 1394, 15:40 عصر
می تونی از dataview استفاده کنی ....!!!! نه؟؟؟ نمی شه؟؟؟!!! :لبخند:

private void textBox1_TextChanged(object sender, EventArgs e)
{
DataView dv = new DataView(table);
dv.RowFilter = "Name like '%" + textBox1.Text + "%'";
dataGridView1.DataSource = dv;
}

چرا میشه !!! :لبخند::تشویق:
این روش جواب داد ممنونم ازتون
ولی خب اون مساله قبلی بدجوری فکرمو مشغول کرده و مطمئن هستم بعدا مجددا باهاش روبه رو میشم
چطور میشه یه آرایه از رکوردها رو به یه یک جدول جدید اضافه کرد ....!؟

khokhan
چهارشنبه 12 اسفند 1394, 15:50 عصر
چرا میشه !!! :لبخند::تشویق:
این روش جواب داد ممنونم ازتون
ولی خب اون مساله قبلی بدجوری فکرمو مشغول کرده و مطمئن هستم بعدا مجددا باهاش روبه رو میشم
چطور میشه یه آرایه از رکوردها رو به یه یک جدول جدید اضافه کرد ....!؟

کل آرایه رو می ریزه توی یه حلقه البته قبلش بایستی تکلیف ستون مقصد رو مشخص می کنی ... یعنی اگه چنین ستونی وجود نداشت ، قبل از حلقه ایجاد می کنی و به تیبل اضافه می کنی
بعد درون حلقه دونه دونه آیتم ها رو می گیری و به اون ستونی که گفتم اضافه می کنی ............
باز اگه خیلی اصرار داری تا از روش خودت که در پست اول اشاره کردی استفاده کنی .... موقع افزودن ردیفها به جدول به جای استفاده از add ، از import استفاده کن تا بهانه اش از بین بره
یه چیزی مثل این :

DataTable dt1 = ds.Tables[0];

DataTable dt2 = new DataTable();

dt2 = dt1.Clone();

foreach(DataRow row in dt1.Rows){

if(row["Column1"] == 10){

// Import the Row into dt2 from dt1
dt2.ImportRow(row);

}

}

csharpcollegian
چهارشنبه 12 اسفند 1394, 17:58 عصر
کل آرایه رو می ریزه توی یه حلقه البته قبلش بایستی تکلیف ستون مقصد رو مشخص می کنی ... یعنی اگه چنین ستونی وجود نداشت ، قبل از حلقه ایجاد می کنی و به تیبل اضافه می کنی
بعد درون حلقه دونه دونه آیتم ها رو می گیری و به اون ستونی که گفتم اضافه می کنی ............
باز اگه خیلی اصرار داری تا از روش خودت که در پست اول اشاره کردی استفاده کنی .... موقع افزودن ردیفها به جدول به جای استفاده از add ، از import استفاده کن تا بهانه اش از بین بره
یه چیزی مثل این :

DataTable dt1 = ds.Tables[0];

DataTable dt2 = new DataTable();

dt2 = dt1.Clone();

foreach(DataRow row in dt1.Rows){

if(row["Column1"] == 10){

// Import the Row into dt2 from dt1
dt2.ImportRow(row);

}

}

آخ آخ اینم جواب داد...!!! :لبخند:
اینم کد صحیح با توجه به راهنمایی شما :

DataRow[] resultRow = ds.Tables["tblVisitant"].Select("Name Like '%" + txtSearch.Text + "%'");
DataTable dt = ds.Tables["tblVisitant"].Clone();
foreach (DataRow row in resultRow)
dt.ImportRow(row);
dgvMain.DataBindings.Clear();
dgvMain.DataSource = dt;
خیلی خیلی ممنون مشکلم کامل حل شد
موفق باشید