PDA

View Full Version : حرفه ای: بهینه ترین روش خواندن از database به محض وارد کردن یک حرف از کیبرد جهت جستجو



behzadkhan
سه شنبه 23 تیر 1394, 19:19 عصر
با سلام

و عرض خسته نباشید به تمام اعضای برنامه نویس

قصد ساخت جستجویی دارم که امکان جستجو به محض فشردن یک کلید از کیبرد را داشته باشد.

حالا فرض کنید که پایگاه داده های ما یک جدول ساده با دو ستون "شناسه" و "نام" باشد.

یک فرم که یک Textbox و یک Datagridview داشته باشد.

به محض اینکه در تسکت باکس یک حرفی را وارد می کنم محتویات موجود در تکست باکس را با فیلد "نام" از جدول بررسی می کند و با هر کدام تطابق داشت. اون سطر در دیتاگریدویو نمایش دهد.

از دوستان خواهش می کنم اگر به این مورد برخورد کرده اند. روش هایی را که برای حلش بیان کرده اند بیان کنند.

من فکر می کنم بیشتر مشکل برای زمان صرف شده جهت هنگام بدست آوردن نتیجه کوئری و نمایش آن در دیتاگرید ویو باشد.

یعنی زمانی که رکورد های ما خیلی زیاد باشد. مثلا چند صد هزار رکورد.

یک Delay به ما می دهد که این خوب نیست. که موجب هنگ کردن فرم می شود.

پیشنهاد من این هست که ابتدا عمل جستو را به یک Thread واگذار کنیم تا فرم هنگ نکند.

و

برای این که منتظر وا نستیم تا کل نتیجه به یکباره نمایش داده شود بصورت Reader سطر به سطر نتیجه را از پایگاه داده ها بخونیم و به دیتاگرید ویو منتقل کنیم.

================================================== =======

توجه نمایید پایگاه داده های ما SQL Server می باشد.
البته اگر پایگاه داده های دیگری هم باشد هیچ مشکلی وجود ندارد.

منتظر ارائه روش های شما هستم.

موفق و پیروز باشید

با تشکر

khokhan
سه شنبه 23 تیر 1394, 21:02 عصر
منتظر ارائه روش های شما هستم.


اگه از MS SQL 2008 یا بالاتر استفاده می کنین پیشنهاد می کنم از امکانات Full Text Search استفاده فرمائید و برای فعال شدن این قسمت ، خاصیت FT Index مربوط به جدول مربوطه رو ابتدا فعال فرموده و FTS hints رو دنبال فرمائید

https://msdn.microsoft.com/en-us/library/ms142571.aspx

alireza264
سه شنبه 23 تیر 1394, 21:02 عصر
سلام
این مسئله قبلا چندین بار مطرح شده
بهترین روشش اینه که دیتا ها رو تو یه لیست بریزی و از Icollectionview استفاده کنی
بگردی توهمین سایت پیداش میکنی چند هفته پیش برای یکی از ذوستان کدشو گزاشتم

behzadkhan
چهارشنبه 24 تیر 1394, 10:15 صبح
سلام
این مسئله قبلا چندین بار مطرح شده
بهترین روشش اینه که دیتا ها رو تو یه لیست بریزی و از Icollectionview استفاده کنی
بگردی توهمین سایت پیداش میکنی چند هفته پیش برای یکی از ذوستان کدشو گزاشتم

با سلام

دوست عزیز

همانطور که گفتید سایت را با کلیدواژه IcollectionView جستجو کردم.

روش خوبی بود و برای خیلی از برنامه ها جواب گو خواهد بود.

و به نظر من برای شرایطی که می دانیم در طول عمر یک نرم افزار حجم داده ها متناسب باشد یعنی هنگام بارگذاری جدول مربوطه در IColloectionView بیش از دویست مگ نباشد.

البته یک ایراد این روش این هست که عمل درج؛حذف و بروز رسانی داده ها علاوه برا اینکه به آن جدول در پایگاه داده ها باید اعمال شود به لیست ما در برنامه هم باید انجام شود.

================================================== =============

سوال:

اگر حجم داده هایی که هنگام اجرا در لیست ما بارگذاری می شود بیشتر از اندازه رم باشد باید چکار کنیم.
در این حالت این روش کارآمد نخواهد بود

آیا راه حلی برای برطرف کردن این مورد دارید؟

با تشکر

asbabi
چهارشنبه 24 تیر 1394, 12:38 عصر
سلام منم همین روش کوئری نوشتن را استفاده کردم و میدونم که با اضافه شدن رکوردها با مشکل مواجه خواهم شد. میخواهم از دیتاگریدویو تلریک استفاده کنم چون میگن خودش یه تکست باکس بالای هر ستونش داره و کلی عملیات میشه روش انجام داد

ghasem110deh
چهارشنبه 24 تیر 1394, 14:29 عصر
حالا من تو خود دیتاگرید ویو جستجو رو انجام میدم !
نمی دونم بهتره یا نه ولی با دیتابیس دیگه کاری نداره (بجزلود اول اطلاعات)
.
.
.
یه چیزی مث جستجوی اکسل شده !

silver189
پنج شنبه 25 تیر 1394, 08:07 صبح
اگه قبلاً دیتاگریدویو رو پر کردید می تونید از کد زیر استفاده کنید که سرعت بسیار بالایی در سرچ دارد :


try
{
((DataTable)dataGridView1.DataSource).DefaultView. RowFilter = string.Format("Name like '%{0}%' ", txtSearch.Text.Trim().Replace("'", "''"));
}
catch (Exception) { }

behzadkhan
پنج شنبه 25 تیر 1394, 18:34 عصر
با سلام

و عرض خسته نباشید

برای اینکه ارائه روش های شما راحتر باشد یک برنامه ساده با سه فرم و یک پایگاه داده ها با یک جدول طراحی کرده ام.

همچنین یک روشی را که به ذهنم رسید در آن پیاده کردم.

از شما خواستارم تا روش مرا بررسی نمایید.

و

صد البته روش های خودتان را در قابل کد در سورس کدی که می زارم در اختیار بقیه قرار دهید.

frmMain

133316


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;


namespace AutoSearchTest
{
public partial class frmMain : Form
{
public frmMain()
{
InitializeComponent();
}


private void btnNew_Click(object sender, EventArgs e)
{
frmAddContact frm = new frmAddContact();
frm.ShowDialog();
}


private void btnSearch_Click(object sender, EventArgs e)
{
frmSearch frm = new frmSearch();
frm.ShowDialog();
}
}
}





frmAddContact

133317


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;
using System.Globalization;


namespace AutoSearchTest
{
public partial class frmAddContact : Form
{
public frmAddContact()
{
InitializeComponent();
}


private void frmAddContact_Load(object sender, EventArgs e)
{
try
{
CultureInfo language = new CultureInfo("fa-ir");
InputLanguage.CurrentInputLanguage = InputLanguage.FromCulture(language);
}
catch
{
}
}


private void btnSubmit_Click(object sender, EventArgs e)
{
if (AddContact())
{
txtName.Clear();
txtFamily.Clear();
txtMobile.Clear();


txtName.Focus();
}
}


private bool AddContact()
{
bool result = false;
SqlCommand cmd = new SqlCommand("AddContact", Program.myConn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddRange(new SqlParameter[]{
new SqlParameter("@Name",txtName.Text),
new SqlParameter("@Family",txtFamily.Text),
new SqlParameter("@Mobile",txtMobile.Text)
});


SqlParameter returnParameter = cmd.Parameters.Add("@ReturnValue", SqlDbType.Int);
returnParameter.Direction = ParameterDirection.ReturnValue;


try
{
Program.myConn.Open();
cmd.ExecuteNonQuery();
Program.myConn.Close();
if ((int)returnParameter.Value > 0)
{
MessageBox.Show(".قبلا از این شماره تلفن استفاده شده است");
}
else
{
result = true;
}
}
catch (Exception ex)
{
Program.myConn.Close();
MessageBox.Show(ex.Message);
}


return result;
}
}
}






frmSearch

133319


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;
using System.Globalization;


namespace AutoSearchTest
{
public partial class frmSearch : Form
{
public frmSearch()
{
InitializeComponent();
}

private SqlCommand cmd;
private SqlDataReader reader;




private void frmSearch_Load(object sender, EventArgs e)
{
try
{
CultureInfo language = new CultureInfo("fa-ir");
InputLanguage.CurrentInputLanguage = InputLanguage.FromCulture(language);
}
catch
{
}
}

private void txtMain_TextChanged(object sender, EventArgs e)
{
SearchContact();
}


private void SearchContact()
{
dgv_List.Rows.Clear();


if (Program.myConn.State != ConnectionState.Open)
{
Program.myConn.Close();
}


if (this.reader != null)
{
this.reader.Close();
}


cmd = new SqlCommand("SearchContact", Program.myConn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddRange(new SqlParameter[]{
new SqlParameter("@Name",txtName.Text),
new SqlParameter("@Family",txtFamily.Text),
new SqlParameter("@Mobile",txtMobile.Text)
});


try
{
Program.myConn.Open();
this.reader = cmd.ExecuteReader();


while (this.reader.Read())
{
object[] obj = new object[] { this.reader["ID"], this.reader["cName"], this.reader["cFamily"], this.reader["cMobile"] };


dgv_List.Rows.Add(obj);


//دستور زیر از هنگ کردن فرم جلوگیری می نماید
Application.DoEvents();
}
}
catch (Exception ex)
{
Program.myConn.Close();
MessageBox.Show(ex.Message);
}


Program.myConn.Close();
}
}
}




==============================================
Stored Procedure

AddContact

ALTER proc [dbo].[AddContact]
(
@Name nvarchar(50),
@Family nvarchar(50),
@Mobile nvarchar(11)
)
AS
BEGIN
DECLARE @ReturnValue int
SET @ReturnValue = 0

IF(EXISTS(SELECT TOP 1 ID FROM tbl_Contact WHERE cMobile = @Mobile))
BEGIN
SET @ReturnValue = 1
END
ELSE
BEGIN
INSERT INTO tbl_Contact
(cName, cFamily, cMobile)
VALUES
(@Name, @Family, @Mobile)
END

return @ReturnValue
END


SearchContact

ALTER proc [dbo].[SearchContact]
(
@Name nvarchar(50),
@Family nvarchar(50),
@Mobile nvarchar(11)
)
AS
BEGIN
SELECT * FROM tbl_Contact
WHERE cName LIKE '%' + @Name + '%' AND cFamily LIKE '%' + @Family + '%' AND cMobile LIKE '%' + @Mobile + '%'
END


=================================================
سورس کد به همراه پایگاه داده ها
VS 2010
SQL EXPRESS 2008

لینک دانلود

133320

133321


توجه نمایید که تنظیمات کانکشن را باید متناسب با سیستم خودتان ست کنید.

این تنظیمات در فایل

Program.cs

قرار دارد.
==============================================

منتظر نظرات

و

روش های شما هستم.

با تشکر

golbafan
پنج شنبه 25 تیر 1394, 23:12 عصر
سلام
چرا انجام این کارهای ساده در دات نت این همه کدنویسی نیاز داره ؟؟؟

behzadkhan
جمعه 26 تیر 1394, 09:05 صبح
سلام
چرا انجام این کارهای ساده در دات نت این همه کدنویسی نیاز داره ؟؟؟

با سلام

دوست عزیز

این به توانایی یک برنامه نویس بستگی دارد.

و

ما اینجا دنبال بهینه ترین روش هستیم.

حالا

خوشحال می شویم که کوتاه ترین روش را به ما آموزش دهید.

با تشکر

golbafan
جمعه 26 تیر 1394, 09:43 صبح
خوشحال می شویم که کوتاه ترین روش را به ما آموزش دهید.

سلام
برای کاری که استارتر پرسیدن بهینه ترین حالت اینه که بجای استفاده از textbox از combobox (برای هر فیلد) استفاده بشه
تا بتوان از خاصیت incremental search خود کمبوباکس استفاده کرد
باید کمبو باکس رو به دیتابیس متصل کرده و autocompeletmode و autocompeletsource رو فعال کنید
حالا با نوشتن هر کاراکتر، کمبوباکس بقیه رو کامل میکنه و دیتاسورس و دیتاست هم به همون کرسر میرن...
اگر دیتاسورس ها یکی باشن و سینک هم باشن، گرید هم به همونجا خواهد رفت
بدون کدنویسی خاصی!

یک راه دیگه هم استفاده از کامپوننت های دیگه هست:
تصویر زیر رو ملاحضه کنید:
https://documentation.devexpress.com/HelpResource.ashx?help=WindowsForms&document=img16325.jpg

hamidrezanilgon
جمعه 26 تیر 1394, 11:58 صبح
سلام دوستان من یه سوال در مورد کامپوننتها داشتم دیددم اینجا بازدید زیاده گفتم مطرحش کنم شاید با راهنمایی دوستان رفع شد
من طبق یک آموزش کامپوننت DevComponents.DotNetBar2.dll را به toolbax برنامه سی شارپم اضافه کردم و کنترلهای اونم اومد تو تول باکسم ولی هر چی کنترلهای اونو می کشم روی فرم اصلا رو فرم نمی افته می افته زیر فرم که اصلا انگار تاثیری نداره و کار نمیکنه
کسی ار دوستان میدونه اشکال کارم کجاست؟
ممنون

khokhan
جمعه 26 تیر 1394, 13:15 عصر
از شما خواستارم تا روش مرا بررسی نمایید.

و

صد البته روش های خودتان را در قابل کد در سورس کدی که می زارم در اختیار بقیه قرار دهید.

frmMain
منتظر نظرات

و

روش های شما هستم.

با تشکر
یه چیزی شبیه فیلتر ستونها در ایکسل رو روی نمونه شما پیاده کردم
ودر هدر هرستون یه آرو بوجود میاد و وقتی آرو باز می شه محتویات ستون برای شما نشون داده می شه
و هر کدوم رو که انتخاب کردین گرید براساس اون انتخاب و همون ستون فیلتر می شه
در این روش یکبار هنگام لود فرم اطلاعات توی گرید ریخته می شه و بر اساس هر کدوم از ستونها که مایل بودین جستجوانجام می شه و دیگه نیازی نیست هربار به جدول مراجعه کنین و رشته اتصال باز و بسته بشه :لبخند:



133339

behzadkhan
جمعه 26 تیر 1394, 22:16 عصر
یه چیزی شبیه فیلتر ستونها در ایکسل رو روی نمونه شما پیاده کردم
ودر هدر هرستون یه آرو بوجود میاد و وقتی آرو باز می شه محتویات ستون برای شما نشون داده می شه
و هر کدوم رو که انتخاب کردین گرید براساس اون انتخاب و همون ستون فیلتر می شه
در این روش یکبار هنگام لود فرم اطلاعات توی گرید ریخته می شه و بر اساس هر کدوم از ستونها که مایل بودین جستجوانجام می شه و دیگه نیازی نیست هربار به جدول مراجعه کنین و رشته اتصال باز و بسته بشه :لبخند:




با سلام

دوست عزیز

روش جالبی بود.

یک مطلب جدید یاد گرفتم.

=======================================

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

و

کارایی جستجو از بین خواهد رفت.

===============================================

منتظر روش های دیگر دوستان نیز هستیم.

با تشکر

behzadkhan
جمعه 26 تیر 1394, 22:23 عصر
سلام
برای کاری که استارتر پرسیدن بهینه ترین حالت اینه که بجای استفاده از textbox از combobox (برای هر فیلد) استفاده بشه
تا بتوان از خاصیت incremental search خود کمبوباکس استفاده کرد
باید کمبو باکس رو به دیتابیس متصل کرده و autocompeletmode و autocompeletsource رو فعال کنید
حالا با نوشتن هر کاراکتر، کمبوباکس بقیه رو کامل میکنه و دیتاسورس و دیتاست هم به همون کرسر میرن...
اگر دیتاسورس ها یکی باشن و سینک هم باشن، گرید هم به همونجا خواهد رفت
بدون کدنویسی خاصی!

یک راه دیگه هم استفاده از کامپوننت های دیگه هست:
تصویر زیر رو ملاحضه کنید:
https://documentation.devexpress.com/HelpResource.ashx?help=WindowsForms&document=img16325.jpg

با سلام

دوست عزیز

روش شما راه قبلا تست نموده ام.

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

یعنی اگر ما چند نام به شکل زیر داشته باشیم

رضا
محمد رضا
علیرضا
محسن
رضایی

و در کمبو باکس کلمه "رضا" را وارد کنیم نتیجه جستجو:

رضا
رضایی

خواهد بود.

اما در روش حاضر نتیجه جستجو:

رضا
محمدرضا
علیرضا
رضایی

خواهد بود که هدف ما هم به این شکل هست.

البته روش که توضیح دادید مطمئنا در جای خودش بهترین کاربرد را خواهد داشت.

================================================== ======

راستش در مورد کامپوننت تحقیق نکردم.

اگر تونستید بیشتر در مورد کامپوننت توضیح دهید.

================================================== ======

منتظر روش های دیگر دوستان هستیم.

با تشکر

khokhan
جمعه 26 تیر 1394, 22:32 عصر
با سلام

دوست عزیز

روش جالبی بود.

یک مطلب جدید یاد گرفتم.

=======================================

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

و

کارایی جستجو از بین خواهد رفت.

===============================================

منتظر روش های دیگر دوستان نیز هستیم.

با تشکر


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

behzadkhan
جمعه 26 تیر 1394, 23:19 عصر
هیچوقت همچی اتفاقی نمی افته ......:لبخند:چون به فرض از ستون نام خانوادگی فلانی رو انتخاب کردی در ستون نام ، وقتی آرو باز می شه تا بر اساس نام هم فیلتر کنی ،دیگه هفتصد ، هشتصدتا نام نمی بینی بلکه تنها نام اشخاصی نمایش داده خواهد شد که قبلا توسط نام خانوادگی فیلتر شدن ...... نمی دونم ... !!! تونستم مطلب رو برسونم یا نه ؟؟؟!!!!
دقیقا همون چیزی که موقع فیلتر کردن در جداول ایکسل ما مشاهده می کنم ......

با سلام

دوست عزیز

من دوباره برنامه را بررسی کردم.

و

متوجه منظرتان شدم.

شما فرض کنید که در جدول ما ده هزار نام متفاوت وجود دارد.

وقتی کمبو باکس نام را باز می کنیم. یک لیست ده هزار تایی داریم و اگر بخواهیم یک اسم را پیدا کنیم باید زمانی را صرف کنیم تا اون اسم پیدا شود.

حالا ما نام مورد نظر را پیدا کردیم خوب ممکنه به قول شما هفتصد یا هشتصد تا رکورد با آن نام باشد.

حالا برای اینکه محدوده خودمان را کوچکتر کنیم باید برای کمبو باکس نام خانودگی هم زمان صرف کنیم تا آنرا پیدا کنیم.

باز هم تعداد نتایج کم خواهد شد.

و همینطور تا آخر که به نتیجه مورد نظرمان برسیم.

ایرادات:

- کاربر مجبور هست چند بار از ماس استفاده کند.

- اگر کاربر دنبال نام "مهدی" باشد. ولی اشتباها فکر کرده که نام "امیر مهدی" هست. به مشکل می خورد. چون اگر "امیر مهدی" را انتخاب کند دیگر "مهدی" را پیدا نخواهد کرد.

- اطلاعات به یکباره خوانده می شوند.

- در صورت حذف، اضافه و یا ویرایش اطلاعات دیتاگریدویو بروز نخواهد شد.

- اگر کاربر فقط بخواهد از فیلد "شماره مبایل" برای جستجو استفاده کند اساسا به مشکل می خورد چون اصلا باید شماره همراه را حفظ باشد تا یکی را از لیست انتخاب کند که این بی معنی هست و اصلا برای جستجو شماره معنا ندارد چون شماره همراه یکتا هست و تکرار شدنی نیست. ولی نام یا نام خانوادگی یکتا نیست و تکرار شدنی هست.

و ...

================================================== ========================

با تشکر

rg_BlackRose
جمعه 02 مرداد 1394, 12:08 عصر
سلام

شما برای اینکار میتونید از DataTable استفاده کنید و رکوردهای موجود در اون رو فیلتر کنید.


برای اینکار باید یدونه DataTable در کلاس فرم تعریف کنید و اطلاعات دیتابیس رو بخونید و درون این DataTable قرار بدید و اون رو به DataSource دیتاگریدویو متصل کنید.
در اینصورت با اضافه کردن،حذف و یا ویرایش رکورد DataTable، دیتاگریدویو به طور اتوماتیک به روز میشه.

من کدهای فرمم رو به صورت یکجا اینجا قرار دادم و مراحل رو مختصر توضیح میدم


public partial class Form1 : Form
{
//مرحله اول
DataTable dt = new DataTable();

public Form1()
{
InitializeComponent();
}


private void Form1_Load(object sender, EventArgs e)
{
//مرحله دوم
//{
//در این قسمت مراحل بارگذاری رکوردها از دیتا بیس و قراردادن اونا در دیتاتیبل رو انجام بدید
//}


//مرحله سوم
dataGridView1.DataSource = dt;


//Config ComboBox
comboBox1.SelectedIndex = 0;
}


//مرحله چهارم
private void textBox4_TextChanged(object sender, EventArgs e)
{
if(comboBox1.SelectedIndex == 0)
{ dt.DefaultView.RowFilter = string.Format("name LIKE '%{0}%'", textBox4.Text); }
else if(comboBox1.SelectedIndex == 1)
{ dt.DefaultView.RowFilter = string.Format("family LIKE '%{0}%'", textBox4.Text); }
else if(comboBox1.SelectedIndex == 2)
{ dt.DefaultView.RowFilter = string.Format("phone LIKE '%{0}%'", textBox4.Text); }
}


//مرحله پنجم
private void button1_Click(object sender, EventArgs e)
{
dt.Rows.Add(new object[] { textBox1.Text, textBox2.Text, textBox3.Text });
}
}




مرحله اول:
تعریف DataTable درون کلاس فرم.

مرحله دوم:
بارگذاری اطلاعات از DataBase و قراردادن رکوردها در DataTable. (که در اینجا بسته به نوع دیتابیستون خودتون باید اقدام کنید)

مرحله سوم:
قراردادن DataTable در DataSource دیتاگرید.

مرحله چهارم:
در این مرحله مراحل فیلتر کردن انجام میشه
برای اینکه مشخص بشه فیلتر کردن بر اساس کدوم ستون باید انجام بشه من از ComboBox استفاده کردم. و با انتخاب مقادیر ComboBox و تایپ در TextBox مربوطه فیلتر کردن DataTable انجام میشه.

dt.DefaultView.RowFilter = string.Format("name LIKE '%{0}%'", textBox4.Text);

در اینجا name نام ستون DataGridView هست که فیلتر بر اساس اون انجام میشه.
TextBox4.Text هم مقداری هست که جدول باید بر اساس اون فیلتر بشه.
این هم بگم که LIKE نقش یک عملگر رو ایفا میکنه، به معنی (همانند بودن). میتونه با عملگرهای دیگه جایگزین بشه،(< = > و ...) که در اینصورت نتیجه فیلتر کردن هم تغییر پیدا میکنه

مرحله پنجم:
این مرحله رو به عنوان نمونه نوشتم.
مراحلی مثل افزودن، حذف و یا ویرایش رکوردهای DataTable.
البته برای ذخیره تغییرات در دیتابیس باید خودتون وارد عمل بشید(اگر نیاز به توصیخات بیشتر بود همینجا اعلام کنید)

این هم نمونه برنامه که با دات نت 3.5 نوشته شده(VS 2013)
133513

موفق باشید.

Beginner67
جمعه 02 مرداد 1394, 17:38 عصر
جستجویی ک من انجام میدم این هست:


private void textBox1_TextChanged(object sender, EventArgs e)
{
studentBindingSource.Filter = "stname like '*" + textBox1.Text + "*'";
}




stname فیلد نام جدول student هست.

Amir4317
جمعه 02 مرداد 1394, 23:02 عصر
خب حالا اگه textbox رو هم در حالت autocomplete قرار بدیدم و سورسش رو ستون متناظر قرار بدیم میشه تلفیقی از روشهای گفته شده تا الآن! :لبخند:

behzadkhan
جمعه 02 مرداد 1394, 23:18 عصر
خب حالا اگه textbox رو هم در حالت autocomplete قرار بدیدم و سورسش رو ستون متناظر قرار بدیم میشه تلفیقی از روشهای گفته شده تا الآن! :لبخند:

با سلام

دوست عزیز

اگر بتوانید ایده خود را بصورت عملی پیاده سازی کنید و در اختیار ما قرار بدهید خیلی بهتر می شود.

اگر همچین قصدی دارید لطفا آنرا در نمونه سورسی که در پست شماره هشت قرار دادم پیاده سازی کنید.

با تشکر

ghasem110deh
سه شنبه 06 مرداد 1394, 23:42 عصر
من از این روش استفاده میکنم ، مث جستجوی اکسل شده تقریبا :

http://s3.picofile.com/file/8202883650/excel_search.png

اگه بصورت تک جستجو کنی دیتاگریدویو رو فیلتر نمیکنه و سطر مورد نظر انتخاب میشه و با فشردن باتون میره روی سطر بعدی !
و اگه باتون جستجوی همه رو بزنی تمام موارد مشابه رو میریزه توی لیست ویو و پیغام جستجو تمام شد میده (کدش یه دوست خارجی گرفتم - بدردت بخوره میزارم همینجا)
جالبه اونا از برنامه نویسای داخلی دست ودل باز ترن :قهقهه:

behzadkhan
سه شنبه 06 مرداد 1394, 23:49 عصر
من از این روش استفاده میکنم ، مث جستجوی اکسل شده تقریبا :


اگه بصورت تک جستجو کنی دیتاگریدویو رو فیلتر نمیکنه و سطر مورد نظر انتخاب میشه و با فشردن باتون میره روی سطر بعدی !
و اگه باتون جستجوی همه رو بزنی تمام موارد مشابه رو میریزه توی لیست ویو و پیغام جستجو تمام شد میده (کدش یه دوست خارجی گرفتم - بدردت بخوره میزارم همینجا)
جالبه اونا از برنامه نویسای داخلی دست ودل باز ترن :قهقهه:


با سلام

دوست عزیز

من دقیقا متوجه نشدم که چه جوری انجام می شود.

لطفا با یک مثال بیان کنید.

همچنین

ظاهرا جستجوی شما حالت درجا ندارد.

با تشکر

ghasem110deh
سه شنبه 06 مرداد 1394, 23:53 عصر
ظاهرا جستجوی شما حالت درجا ندارد.

منظورتون چیه !؟

behzadkhan
چهارشنبه 07 مرداد 1394, 00:05 صبح
منظورتون چیه !؟

با سلام

دوست عزیز

منظور من به این شکل هست که در ست زمانی که داریم در تکست باکس یک حرف را وارد می کنیم عملی جستجو را انجام دهد و نتیجه را به ما نشان دهد.

به مانند گوگل که به محض وارد کردن حروف جستجو را انجام می دهد.

با تشکر

ghasem110deh
چهارشنبه 07 مرداد 1394, 00:14 صبح
الان نه ، ولی میشه جستجو رو توی TextChanged قرار داد !

behzadkhan
چهارشنبه 07 مرداد 1394, 00:21 صبح
الان نه ، ولی میشه جستجو رو توی TextChanged قرار داد !

با سلام

دوست عزیز

من فرض می کنم که شما اولین بار هست به این مشکل برخوردید

و

دنبال یک راه حل برای آن هستید.

خوب من و دوستان روش های خود را ارائه کردیم.

می تونید از اونا استفاده کنید

و

یا خودتان یک روش ایجاد کنید و آن را در اختیار ما قرار دهید.

اگر هم

که قبلا این مشکل را حل کردید خوشحال می شویم که نحوه انجام روشتان رابه ما یاد دهید.

================================================== ============

همچنین

اگر امکانش باشد کد یا روش جستجو همان فرمی را که نشان داده در اختیار ما قرار دهید

درسته که بصورت در جا نیست اما می شه ازش یک نکاتی را یاد گرفت.

================================================== ===============

با تشکر

ناامید
چهارشنبه 07 مرداد 1394, 03:07 صبح
سلام.
جستجو در این تعداد رکوردها بدون کلید اصلی و index غیر منطقی به نظر میاد، اگر فردی دنبال یک اطلاعات خاصی باشد میتواند با کلید اصلی به سرعت به آن دسترسی پیدا کند و اینطور هزینه ی اضافی نخواهیم داشت و اگر با ترکیب چندین فیلد یک رکورد متمایز بدست می آید بهتر است که از متمایزترین فیلد به عنوان کلید اصلی استفاده شود و از آن برای کمک گرفتن و سرعت بخشیدن استفاده شود و نکته ی دیگری هم که وجود دارد بازیابی چند هزار رکورد از بین چند صد هزار رکورد و نمایش آن در دیتا گرید ویو ثبب اتلاف وقت، حافظه و ... می شود و همچنین نتیجه ی مناسبی هم نخواهد داشت. دیتا گرید ویو زمانی کار آمد خواهد بود که کاربر بتواند تمامی رکوردها را در آن مشاهده کند یا با حرکت دادن اسکرول به اندازه که باعث اذیت او نشود همه اطلاعات را مشهاده کند در نظر داشته باشید که 8000 رکورد برگشت داده شود و در دیتاگرید ویو نمایش داده شود آیا کاربر میتواند 8000 رکورد را ببیند؟ اگر نمیتواند ببیند پس چه دلیلی وجود دارد که 8000 رکورد بازگشت داده شود؟
نکته ای که وجود دارد باید بار لود کردن رکوردها را کاهش داد تا سبب هزینه اضافی نشود برای مثال از کلمه کلیدی top استفاده کرد و تعداد رکوردهای بازیابی شده رو بر عهده کاربر گذشت و حداکثری هم برای آن تعیین کرد تا رکوردها هم به سرعت لود شوند و هم با سرعت مناسب در دریتا گرید ویو قرار گیرد تا کاربر بلافاصله اطلاعات را مشاهده کند. همچنین بازیابی تمامی رکوردها و نمایش دادن آنها در دیتاگرید ثبب بار اضافی است و بهتر است این کار انجام نشود.
در جستجوی گوگل به نظر میاید که از autocomplet تکست باکس استفاده می شود و به نظر میاید یکی از کارهایی که انجام میدهند محدود کردن اطلاعات بازیابی شده است تا جست جو هزینه بر نشود.

همچنین اگر حتما نیاز بود که اطلاعات بسیار زیادی در دیتا گرید ویو نمایش داده شود به نظرم بهتر است که اطالاعات صفحه بندی شوند به اینصورت که ابتدا 100 رکورد اول بازیابی شده نمایش داده شود سپس 100 رکورد بعدی و ... و همه اطلاعات به صورت یکجا بازیابی شده و در یک صفحه نمایش داده نشود.

behzadkhan
چهارشنبه 07 مرداد 1394, 10:55 صبح
سلام.
جستجو در این تعداد رکوردها بدون کلید اصلی و index غیر منطقی به نظر میاد، اگر فردی دنبال یک اطلاعات خاصی باشد میتواند با کلید اصلی به سرعت به آن دسترسی پیدا کند و اینطور هزینه ی اضافی نخواهیم داشت و اگر با ترکیب چندین فیلد یک رکورد متمایز بدست می آید بهتر است که از متمایزترین فیلد به عنوان کلید اصلی استفاده شود و از آن برای کمک گرفتن و سرعت بخشیدن استفاده شود و نکته ی دیگری هم که وجود دارد بازیابی چند هزار رکورد از بین چند صد هزار رکورد و نمایش آن در دیتا گرید ویو ثبب اتلاف وقت، حافظه و ... می شود و همچنین نتیجه ی مناسبی هم نخواهد داشت. دیتا گرید ویو زمانی کار آمد خواهد بود که کاربر بتواند تمامی رکوردها را در آن مشاهده کند یا با حرکت دادن اسکرول به اندازه که باعث اذیت او نشود همه اطلاعات را مشهاده کند در نظر داشته باشید که 8000 رکورد برگشت داده شود و در دیتاگرید ویو نمایش داده شود آیا کاربر میتواند 8000 رکورد را ببیند؟ اگر نمیتواند ببیند پس چه دلیلی وجود دارد که 8000 رکورد بازگشت داده شود؟
نکته ای که وجود دارد باید بار لود کردن رکوردها را کاهش داد تا سبب هزینه اضافی نشود برای مثال از کلمه کلیدی top استفاده کرد و تعداد رکوردهای بازیابی شده رو بر عهده کاربر گذشت و حداکثری هم برای آن تعیین کرد تا رکوردها هم به سرعت لود شوند و هم با سرعت مناسب در دریتا گرید ویو قرار گیرد تا کاربر بلافاصله اطلاعات را مشاهده کند. همچنین بازیابی تمامی رکوردها و نمایش دادن آنها در دیتاگرید ثبب بار اضافی است و بهتر است این کار انجام نشود.
در جستجوی گوگل به نظر میاید که از autocomplet تکست باکس استفاده می شود و به نظر میاید یکی از کارهایی که انجام میدهند محدود کردن اطلاعات بازیابی شده است تا جست جو هزینه بر نشود.

همچنین اگر حتما نیاز بود که اطلاعات بسیار زیادی در دیتا گرید ویو نمایش داده شود به نظرم بهتر است که اطالاعات صفحه بندی شوند به اینصورت که ابتدا 100 رکورد اول بازیابی شده نمایش داده شود سپس 100 رکورد بعدی و ... و همه اطلاعات به صورت یکجا بازیابی شده و در یک صفحه نمایش داده نشود.

با سلام

دوست عزیز

شما دقیقا به دو نکته مهم و کلیدی اشاره کرده اید

اول : به حداقل رساندن کارهایی که یک کاربر باید انجام دهد تا یک جستجو نتیجه بدهد.

دوم : عدم نمایش یکباره تمام نتایج

=======================================

استفاده از Top و صفحه بندی خوب هست و می توان آنرا را با جستجوی درجا ترکیب کرد.


برای رفتن به صفحه قبلی و بعدی مثلا می توان از دوتا دکمه استفاده کرد.

من نمی خواهد که کاربر اصلا از تکست باکس خارج شود و روی دکمه ها کلید کند چون اینجوری یک عمل جدید را به کاربر تحمیل کرده ایم

می تونید روشی را بگید که درست در همان تکست باکس باشیم و بدون اینکه روی آن دکمه ها کلیک کنیم روی صفحه بعدی و یا قبلی برویم.

================================================== ==========

همچنین خوشحال می شویم

که روش خودتان را روی نمونه کدی که در پست های اول قرار دادم پیاده سازی کنید

و یا

فقط اون تیکه کدش را به ما بدهید.

ویا

کلا روش خود را جزئی تر توضیح بدهید و بگویید که برای انجام این روش باید این کارها را انجام داد و این مشکلات را رفع کرد.

================================================== ============

با تشکر

Aqeel95
پنج شنبه 08 مرداد 1394, 21:41 عصر
من الان دارم یه برنامه مینویسم
با توجه به اینکه دیتاگریدم بالغ بر 25تا ستون داره نمیتونستم برای جستجو برای هر ستون تکست باکس بزارم
برای همین برای عناوین ستون ها یک کمبوباکس گذاشتم و فقط یه دونه تکست باکس
حالا کاربر از کمبوباکس نام ستون رو سرچ میکنه و بعد متن رو مینویسه توی تکست باکس و با ورود هر کاراکتر (حرف) سطر هایی که ستون مورد نظر کاربر اون کاراکتر رو دارن نمایش داده میشن
(البته با توجه به اینکه ممکنه کاربر بخواد چند ستون رو جستجو کنه لازمه دو یا سه تا کمبوباکس وتکست باکس دیگه هم بزارم)
این نمونه ای از کد سرچم توی رویداد text change تکست باکس


dt.Clear();
sqlcom.CommandText = "select * from Tbl_Add where Row>=1";
if (Com_All.Text == "شماره شناسایی")
sqlcom.CommandText += "and Num like'%" + Txt_All.Text + "%'";
elseif (Com_All.Text == " نام")
sqlcom.CommandText += "and Sname like'%" + Txt_All.Text + "%'";
elseif (Com_All.Text == " نام خانوادگی")
sqlcom.CommandText += "and Fname like'%" + Txt_All.Text + "%'";
sqlda.Fill(dt);
dataGridView1.DataSource = dt;

=============
امیدوارم مفید باشه واگر که به نظرتون مشکلی داره ممنون میشم راهنماییم کنید

behzadkhan
پنج شنبه 08 مرداد 1394, 21:50 عصر
من الان دارم یه برنامه مینویسم
با توجه به اینکه دیتاگریدم بالغ بر 25تا ستون داره نمیتونستم برای جستجو برای هر ستون تکست باکس بزارم
برای همین برای عناوین ستون ها یک کمبوباکس گذاشتم و فقط یه دونه تکست باکس
حالا کاربر از کمبوباکس نام ستون رو سرچ میکنه و بعد متن رو مینویسه توی تکست باکس و با ورود هر کاراکتر (حرف) سطر هایی که ستون مورد نظر کاربر اون کاراکتر رو دارن نمایش داده میشن
(البته با توجه به اینکه ممکنه کاربر بخواد چند ستون رو جستجو کنه لازمه دو یا سه تا کمبوباکس وتکست باکس دیگه هم بزارم)
این نمونه ای از کد سرچم توی رویداد text change تکست باکس

=============
امیدوارم مفید باشه واگر که به نظرتون مشکلی داره ممنون میشم راهنماییم کنید

با سلام

دوست عزیز

من قسمت کمبوباکس را کامل متوجه نشدم.

اگر امکانش هست یک عکس از فرمتان بگیرید و ارسال کنید.

=================================================

همه ما کدهایمان ایراداتی دارد.

==================================================

به نظر من مهمترین ایراد کد شما این هست که اگر مقدار رکوردی که برگردانده می شود اگر زیاد باشد مثلا به چند ثانیه وقت نیاز باشد فرم شما هنگ خواهد کرد و این خوشایند کاربری که با آن کار می کند نخواهد بود.

البته اگر رکوردهای شما کم باشد فکر نمی کنم مشکلی پیش بیاید.

با تشکر

Aqeel95
پنج شنبه 08 مرداد 1394, 21:56 عصر
با سلام

دوست عزیز

من قسمت کمبوباکس را کامل متوجه نشدم.

اگر امکانش هست یک عکس از فرمتان بگیرید و ارسال کنید.

=================================================

همه ما کدهایمان ایراداتی دارد.

==================================================

به نظر من مهمترین ایراد کد شما این هست که اگر مقدار رکوردی که برگردانده می شود اگر زیاد باشد مثلا به چند ثانیه وقت نیاز باشد فرم شما هنگ خواهد کرد و این خوشایند کاربری که با آن کار می کند نخواهد بود.

البته اگر رکوردهای شما کم باشد فکر نمی کنم مشکلی پیش بیاید.

با تشکر



والا فکرنمیکنم که سرعت کم بشه .... (البته شاید هم کم بشه... اگرشد توی آپدیتای بعدی درستش میکنم)

اینم تصویر فرم ( عربیه :) )
کاربر توی کمبوباکس ستون موردنظرش رو انتخاب میکنه ومتن رو توی تکست باکس مینویسه وجستجو اتوماتیک انجام میشه
133742

behzadkhan
پنج شنبه 08 مرداد 1394, 22:09 عصر
والا فکرنمیکنم که سرعت کم بشه .... (البته شاید هم کم بشه... اگرشد توی آپدیتای بعدی درستش میکنم)

اینم تصویر فرم ( عربیه :) )
کاربر توی کمبوباکس ستون موردنظرش رو انتخاب میکنه ومتن رو توی تکست باکس مینویسه وجستجو اتوماتیک انجام میشه


با سلام

دوست عزیز

الان متوجه روشتان شدم.

این هم در نوع خودش جالب هست.

====================================

ببینید بزارید در مورد سرعت اینجوری توضیح بدهم.

با فرض اینکه برنامه شما فقط از یک Thread استفاده کرده باشد:

شما قبول دارید که وقتی یک کوئری به پایگاه داده می زنید برنامه منتظر می ماند تا نتیجه کوئری برگردد و آن را دیتاگرید ویو قرار دهد.

زمانی که این عمل کمتر از نیم ثانیه طول بکشد هیچ مشکلی پیش نمی آید و کاربر متوجه آن نمی شود.

ولی وقتی زمان بیش از این می شود کاربر را اذیت می کند.

حالا چطور زمان زیاد می شود.

مثلا برای واکشی تا ده هزار رکورد کامپیوتر شما با مشخصات سخت افزاری و نرم افزاریش حداکثر نیم ثانیه می شود.

ولی

وقتی که واکشی به 50 هزار رکورد می رسد می شود 3 ثانیه.

البته این زمان در کامپیوتر های مختلف متفاوت خواهد بود.

امیدوارم منظور را درست رسانده باشم.

با تشکر

Aqeel95
پنج شنبه 08 مرداد 1394, 22:13 عصر
بله کامل و واضح درمورد سرعت توضیح دادین وممنون از شما
فکرنمیکنم دیگه رکورد ها اینقدر زیاد بشن....
1000 دو یا دیگه خیلی زیاد 10000
اما بایستی چک کنم که چه مقدار طول میکشه سرعت جستجو با این روش ... (که ایدش از خودم بوده.... خوشحالم که خوشتون اومد)
ان شالله بهتون خبر میدم زمانش رو

behzadkhan
پنج شنبه 08 مرداد 1394, 22:21 عصر
بله کامل و واضح درمورد سرعت توضیح دادین وممنون از شما
فکرنمیکنم دیگه رکورد ها اینقدر زیاد بشن....
1000 دو یا دیگه خیلی زیاد 10000
اما بایستی چک کنم که چه مقدار طول میکشه سرعت جستجو با این روش ... (که ایدش از خودم بوده.... خوشحالم که خوشتون اومد)
ان شالله بهتون خبر میدم زمانش رو

با سلام

دوست عزیز

من هم فکر نمی کنم که برای آن مقدار رکورد به مشکل بخورید.

البته کار از محکم کاری عیب نمی کنه.

=============================================

از اینکه تمایل به پیگیری داریم خوشحال هستم.

با تشکر