PDA

View Full Version : سوال: جستجو در datagridview منطقی تر هست یا در دیتابیس؟



ghasem110deh
سه شنبه 15 اردیبهشت 1394, 19:51 عصر
سلام به همه ..
تو یه پروژه که 60 تا 70 درصد کارش سرچ کردنه ...
جستجو تو دیتابیس (sql) با ایندکس و ... منطقی تره و بهتر جواب میده یا جستجو تو اطلاعات بارگذاری شده در گریویو !؟
.
.
.
هم جستجو با یک ورودی و هم جستجوی با چند ورودی (advanced search)
باگریدویو که خیلی کد نویسیش کمتره (پروژه با معماری سه لایه و پروسیجر هستش)

Mofid.m
سه شنبه 15 اردیبهشت 1394, 20:26 عصر
درود به شما
بستگی داره.
اگه فقط جستجو و نمایش اطلاعات دیتابیس هایی باشه دائما در حال تغییر نباشه این روش خوبیه.
مثلا برای برنامه های دسکتاپ و دیتابیس local این روش خوبه.
اما اگر بعضی از کاربران در حال مثلا ثبت فاکتور هستن و این فاکتور ها هر چند ثانیه توسط این کاربر ها ثبت میشن بهتره سرچ رو از دیتابیس انجام بدی

ghasem110deh
سه شنبه 15 اردیبهشت 1394, 20:45 عصر
سلام
دقیقا هر دو حالت رو داره !
یعنی چند تا جدول هست که readOnly باید باشه ، باید اطلاعاتش رو از قبل وارد دیتابیس کنم :
زمینه کاریشون و اطلاعات ساخت و آلیاژ ذوب تو چه دمایی و این حرفاست --> 99% تغییر نمیکنه
و هم بحث خرید و فروش مواد خام و هم فروش محصولاتشون رو دارن ؛
و چیزای دیگه که همه برنامه ها تو این سطح دارن : اطلاعات پرسنلی و حقوق هم نمیخوان - حسابداری دارن :)
----------------------------------------------------------------------------------------------------------------------
بحث اصلیشون جستجوی اطلاعات کاریشونه ! مثلا یه ورودی میدن (اسم فلز - دمای ذوب) میخوان تمام آلیاژهایی که این فلز و یا هم فلز و هم دما توی ساختارش وجود داره رو بشون بده (از همون جداول که اطلاعات کاریشونه)
بعد اگه تایید کردن اون محصول با اون اطلاعات تو یه جدول مشخصات ساخت ذخیره بشه !
.
.
.
موندم چیکار کنم !

ghasem110deh
سه شنبه 15 اردیبهشت 1394, 22:52 عصر
منظورم یه همچینی چیزیه :

http://stackoverflow.com/questions/5843537/filtering-datagridview-without-changing-datasource

میخوام بدونم شما باشین این راه رو میرین یا فیلتر مستقیم دیتابیس رو ؟

Mahmoud Zaad
چهارشنبه 16 اردیبهشت 1394, 09:00 صبح
سلام
شما اگه همه اطلاعات رو توی دیتاگریدویو نشون میدی می تونی توی همون دیتاگریدویو جستجو انجام بدی سرعتش هم بالاتره با دیتابیس هم درگیر نیستی. اما بعضی مواقع نیازی نیست ما در دیتاگریدویو مثلاً کد اشخاص رو نشون بدیم اما نیازه بر اساس کد اشخاص جستجو کنیم خب اینجا اگه کلاً اطلاعات ستون کد شخص رو لود نکرده باشی، نمیشه بر این اساس توی دیتاگریدویو جستجو کرد و باید توی دیتابیس جستجو کرد. یا زمانیکه شما اطلاعات رو صفحه بندی می کنی اگه بخوای توی دیتاگریدویو جستجو کنی قاعدتاً فقط همون چندتا رکورد رو می تونی جستجو کنی و برای سایر جستجوها باید به دیتابیس مراجعه کنی. حالا این موارد و مواردی که دوستان گفتند رو بررسی کنید و یک روش رو انتخاب کنید.

ghasem110deh
چهارشنبه 16 اردیبهشت 1394, 12:39 عصر
سلام
توی دیتاگریدویو سرچ میزنم !
------------------------------
منتها الن دو تا مشکل دارم : دو تا تکست رو نمی تونم با هم مچ کنم (که بر اساس هر دو جستجو بشه) --- دوم اینکه گفتن نباید اطلاعات فیلتر بشه (مثل Find اکسل میخوان ، که همه اطلاعات هست ولی فوکوس روی نتیجه جستجو بیاد)
مثلا یه دما که سرچ زده شد ... دمای های بالتر و پایین تر هم باس نمایش داده بشه ولی فوکوس رو نتیجه جستجو باشه !
الان این کد رو زدم ولی چند تا ایراد داره :

private void textBox1_TextChanged(object sender, EventArgs e) {
//IEnumerable<DataGridViewRow> rows = from DataGridViewRow row in dataGridView1.Rows where row.Cells["InvoiceId"].Value.ToString().Equals(textBox1.Text)
//select row;
//foreach (DataGridViewRow r in rows)
// r.Selected = true;
DataGridViewRow row2 =
(from DataGridViewRow r in dataGridView1.Rows
where r.Cells["InvoiceId"].Value.ToString().Equals(textBox1.Text)
select r).FirstOrDefault();
if (row2 != null)
row2.Selected = true;
}

اول اینکه وقتی یه عدد دیگه جستجو بشه ... قبلی هنوز تو حالت انتخابه ، و اگه تکست رو خالی کنم باز همه تو انتخاب شده ها ، انتخاب شده می مونن !
و ایراد اصلیش اینه که اگه مثلا شماره 20 (اینجا آیدی) سرچ بشه ، حالت انتخاب روی سطر 20 میره ولی باید با بالا و پایین کردن خودت پیداش کنی !
.
.
.
میخوام اگه هر سطری انتخاب شد ... علاوه بر انتخاب شدن ... دیتاگرید بره روی اون (دقیقا مثل اکسل)

با این میشه کاری کرد ؟
https://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.firstdisplayedsc rollingrowindex.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1

بیتا حکمت
چهارشنبه 16 اردیبهشت 1394, 13:11 عصر
تا جایی که یادمه کنترل Radgrid (تلریک ) ، به صورت پیش فرض امکانی که مد نظر شما هست رو داره .

Mahmoud Zaad
چهارشنبه 16 اردیبهشت 1394, 13:25 عصر
از این کدها می تونید توی textChanged تکست باکس استفاده کنید:
foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (row.Cells["Column1"].Value == null)
{
continue;
}
//if (row.Cells["Column1"].Value.ToString().Trim().StartsWith(txtSearch.Text ))
if (row.Cells["Column1"].Value.ToString().Trim() == txtSearch.Text)
//if (row.Cells["Column1"].Value.ToString().Trim().ToLower().EndsWith(txtSea rch.Text.ToLower()))
{
dataGridView1.CurrentCell = row.Cells["Column1"];
dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView1.Rows[row.Index].Index;

return;
}
}

فقط، آیتمی که پیدا میشه میاد به عنوان اولین ردیف یعنی ردیف قبلش رو نمی تونید ببینید. برای رفع این مشکل باید خط زیر رو تغییر بدید البته چندتا شرط بزارید که خطا نداشته باشید مثلاً در اینجا آیتمی که پیدا میشه میاد ردیف سوم

dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView1.Rows[row.Index].Index-2;
یه 2- به آخر این خط اضافه شد.

ghasem110deh
چهارشنبه 16 اردیبهشت 1394, 15:19 عصر
ممنون ...
همین که فیلتر نمیشه خوبه ! منتها اگه مقدار تکراری داشته باشه ، خطا میده !
باس کد رو توی باتون بنویسم و با هر بار کلیک مقدار بعد رو پیدا کنه :)

ghasem110deh
جمعه 18 اردیبهشت 1394, 10:25 صبح
الان مشکل اول حل شد :)
یکی ، یکی مقادیر مشابه رو پیدا میکنه ...
منتها حتما باس کل کلمه نوشته بشه ... مثلا اگه بجای "بابا" بنویسیم "باب" هیچی نشون نمیده !
دوم اینکه نتیجه جستجو ها رو بریزیم توی لیست ویو (مثل جستجوی اکسل)

Mahmoud Zaad
جمعه 18 اردیبهشت 1394, 12:51 عصر
همون دو خطی که کامنت شده برای همین کار هست، شما می تونید بخشی از متن رو جستجو کنید (Contains) کلماتی که با کلمه مورد جستجو شروع میشن رو پیدا کنید (StartsWith) یا کلماتی که با کلمه مورد جستجو تموم میشن رو پیدا کنید (EndsWith).
if (row.Cells["Column1"].Value.ToString().Trim().StartsWith(txtSearch.Text ))
if (row.Cells["Column1"].Value.ToString().Trim().Contains(txtSearch.Text ))

برای پر کردن لیست ویو:
for (int i = 0; i < dataGridView1.Rows.Count-1; i++)
{
DataGridViewRow drow = dataGridView1.Rows[i];

ListViewItem lvi = new ListViewItem(drow.Cells["id"].Value.ToString());
lvi.SubItems.Add(drow.Cells["name"].Value.ToString());

listView1.Items.Add(lvi);
}

ghasem110deh
جمعه 18 اردیبهشت 1394, 15:01 عصر
الان کد این شد :

private int searchIndex = -1; private void button1_Click(object sender, EventArgs e)
{
button1.Text = "Find Next";
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
searchIndex = (searchIndex + 1) % dataGridView1.Rows.Count;
DataGridViewRow row = dataGridView1.Rows[searchIndex];
if (row.Cells["ProductId"].Value == null)
{
continue;
}
// پیدا کردن کلماتی که با حروف جستجو شده شروع یا تمام می شوند
if (row.Cells["ProductId"].Value.ToString().Trim().StartsWith(textBox1.Text) || row.Cells["ProductId"].Value.ToString().Trim().Contains(textBox1.Text))
{
ListViewItem lvi = new ListViewItem(row.Cells["ProductId"].Value.ToString()); // ریختن در لیست ویو
lvi.SubItems.Add(row.Cells["ProductId"].Value.ToString());
listView1.Items.Add(lvi);
dataGridView1.CurrentCell = row.Cells["ProductId"];
dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView1.Rows[row.Index].Index;
row = dataGridView1.Rows[i];
return;
}
}
}

خوبه ... ولی جای کار داره --- باید تمام سطر رو بریزم توی لیست ویو که ازش پرینت هم بگرین و یکم بش رنگ و لعاب بدم :)
ممنون از همه ، خصوصا Mahmoud Zaad !
بنظر خودم (بجز در شرایط خاص) از جستجو توی بانک بهتره !
خروجیشم اینه : (عدد 200 هشت بار تکرار شده)

Mahmoud Zaad
جمعه 18 اردیبهشت 1394, 16:45 عصر
اگه میخواید به همین روش اطلاعات رو بریزید تو لیست ویو، توی لیست ویو به تعداد مورد نیاز ستون درست کنید و view رو هم بزارید روی Details منتها اینجا تا زمانیکه هر بار روی جستجو کلیک نکنید آیتم ها به لیست ویو اضافه نمیشن. برای این قسمت از کار می تونید از DataView (http://www.dotnetfunda.com/articles/show/2456/process-datatable-using-dataview-in-csharp) استفاده کنید و نتیجه جستجو رو یکدفعه بریزید تو لیست ویو.

MehdiElexal
جمعه 18 اردیبهشت 1394, 22:21 عصر
به دلیل آپدیت و یا اینزرت شدن هر لحظه از دیتا بیس بهتره جستجو از طریق دیتا بیس انجام شه و یا حداقل قبل از جستجو یک بار گرید رو رفرش کنید
موفق باشید

ghasem110deh
شنبه 19 اردیبهشت 1394, 09:31 صبح
به دلیل آپدیت و یا اینزرت شدن هر لحظه از دیتا بیس بهتره جستجو از طریق دیتا بیس انجام شه و یا حداقل قبل از جستجو یک بار گرید رو رفرش کنید
موفق باشید

جستجو واسه جداول readOnly هستش ... که اطلاعات جدید نمیگیرن !

ghasem110deh
دوشنبه 21 اردیبهشت 1394, 13:53 عصر
دوستان چطور تکست باکس رو غیر حساس به حروف بزرگ و کوچیک کنم !؟
الان اگه کلکمه ای با حروغ بزرگ باشه پیداش نمیکنه !

بیتا حکمت
دوشنبه 21 اردیبهشت 1394, 14:00 عصر
دوستان چطور تکست باکس رو غیر حساس به حروف بزرگ و کوچیک کنم !؟
الان اگه کلکمه ای با حروغ بزرگ باشه پیداش نمیکنه !

برای مقایسه رشته ها می تونید از String.Compare استفاده کنید ، پارامتر سوم رو که برابر True قرار بدین مقایسه بدون حساسیت به حروف صورت می گیره

hamid_hr
دوشنبه 21 اردیبهشت 1394, 14:07 عصر
اگر سطر اول گرید رو برا سرچ بزارین راحت تر میشه

این یه نمونه کوچیک

Mahmoud Zaad
دوشنبه 21 اردیبهشت 1394, 14:31 عصر
از متدهای ToLower و ToUpper برای string هم میتونی استفاده کنی: textBox1.Text.ToLower()

ali_habibi1384
دوشنبه 21 اردیبهشت 1394, 18:42 عصر
با سلام خدمت دوستان.
حرف آقای mofid m رو تائید میکنم و اضافه میکنم چون SP همیشه بعد از ایجاد شدن Template واسه خودش میسازه سرعت جستجو رو بالاتر میبره و هم اطلاعات رو چون از DataBase میخونه بهتره که از SP استفاده کنید

ghasem110deh
دوشنبه 21 اردیبهشت 1394, 21:10 عصر
ممنون از توجه و راهنمایی همه دوستان !


با سلام خدمت دوستان.
حرف آقای mofid m رو تائید میکنم و اضافه میکنم چون SP همیشه بعد از ایجاد شدن Template واسه خودش میسازه سرعت جستجو رو بالاتر میبره و هم اطلاعات رو چون از DataBase میخونه بهتره که از SP استفاده کنید

با sp تو یه پروژه دیگه استفاده کردم ... ولی انجا باید اطلاعات فیلتر نشه (بالاتر توضیح دادم) ؛ نتونستم با sp همچین کاری رو بکنم !