به جای متد find در dataview چه راهکاری پیشنهاد می شه
سلام عیدتون مبارک
یه مشکلی برام پیش اومد
توی یه بانک اطلاعاتی یه فیلد به صورت متن با طول 50 کاراکتر تعریف شده
اطلاعاتی که توی این فیلد ذخیره می شن طولشون متغییره ..
حالا توی یه برنامه وقتی یه dataview تعریف کردم و خواستم از متد find اون استفاده کنم به مشکل خوردم .. چون تا اونجایی که فهمیدم متنی که باید جستجو بشه دقیقا باید توی دیتابیس هم تکرار شده باشه یعنی به این صورت نیست که شبیه متن مورد نظر رو از دیتاست بیرون بکشه
خب دوستان عزیز .. به جای find متد دیگه ای رو می شناسین یا می شه کاریش کرد که فضای خالی فیلد رو در نظر نگیره ؟
(اینم بگم که با یه کوئری اطلاعات لازم رو توی دیتاست ریختم و می خوام توی اونا جستجو داشته باشم)
متشکراتم
نقل قول: به جای متد find در dataview چه راهکاری پیشنهاد می شه
سلام دوست عزیز عید شما هم مبارک
برای متن بهتره از عملگر Like استفاده کنی تا شبیه اون متن رو پیدا کنی
نقل قول: به جای متد find در dataview چه راهکاری پیشنهاد می شه
nvarchar نوع ستون توی دیتابیس sql
نقل قول: به جای متد find در dataview چه راهکاری پیشنهاد می شه
من فکر نمی کنم دستور Like برای DataGrid وجود داشته باشه.اگه هست نمونه کدش رو بنویسید تا من و بقیه دوستان هم که بلد نیستند یاد بگیرند.تا اونجایی که می دونم Like مربوط به Query می شه.
ولی یه پیشنهاد برای این مسئله دارم.
دوست عزیز اول جدول خودت رو توی دیتاست براساس اون فیلدی که می خوای جستجو کنی مرتب کن و سپس از کد زیر برای پیدا کردن زیر رشته در یک ستون جدول دیتاست استفاده کن.باید براساس ستونی که می خوای جستجو کنی مرتب باشه چون این یک جستجوی باینری با کمی تغییرات هستش که خودم نوشتم و اگه مرتب نباشه جواب نمی ده.
public int BinarySearch_SubString(ref System.Data.DataSet DS, string TableName, string ColumnSortedName, string item)
{
int ColumnIndex = DS.Tables[TableName].Columns[ColumnSortedName].Ordinal;
int low = 0;
int high = DS.Tables[TableName].Rows.Count - 1;
int mid = -1;
while (low <= high)
{
mid = (low + high) / 2;
string Element = (string)DS.Tables[TableName].Rows[mid].ItemArray[ColumnIndex];
if (Element.Length > item.Length)
Element= Element.Substring(0, item.Length);
if (Element== item)
return mid;
if (Element.CompareTo(item) > 0)
high = mid - 1;
else
low = mid + 1;
}
return -1;
}
امیدوارم کارت رو راه بندازه.
نقل قول: به جای متد find در dataview چه راهکاری پیشنهاد می شه
سلام
در روش های بالا که مبنای جستجو بر اساس مقایسه بین موجودیت رشته است . فاصله یا space هم جزئی از رشته محسوب میشه. مثلا دو رشته ی Ali B و Ali B مساوی در نظر گرفته نمیشن. باید خودتون تابع یا دستوراتی بنویسید که Space ها رو در رشته حذف کنه مثلا Trim()
نقل قول:
من فکر نمی کنم دستور Like برای DataGrid وجود داشته باشه.اگه هست نمونه کدش رو بنویسید تا من و بقیه دوستان هم که بلد نیستند یاد بگیرند.تا اونجایی که می دونم Like مربوط به Query می شه.
بله این گفته تقریبا درسته .
BinarySearch شاید برای جستجوی رشته ها شاید خیلی خوب نباشه . بعضی از توابع درونی .Net که از index گذاری استفاده میکنن سریعتر جواب میدن
مثلا میتونیم از خاصیت DataTable ، RowFilter ی که میخوایم جدول رو پر کنیم نیز استفاده کنیم
dataTable.DefaultView.Sort = "LastName";
dataTable.DefaultView.RowFilter = "LastName LIKE ('" + this.TextBox_LastName.Text.Trim() + "%') ";
نقل قول: به جای متد find در dataview چه راهکاری پیشنهاد می شه
private void LoadData()
{
if (!this.m_Dis)
{
Tafsily[] t = Tafsily.GetSharedData().FindAll(new Predicate<Tafsily>(this.Match_Tafsily));
if (t.Length != 0)
{
this._MainDataGridView.DataSource = t;
}
else
{
this._MainDataGridView.DataSource = null;
}
}
}
private bool Match_Tafsily(Tafsily C)
{
if ((C.Moin ?? -1) != Condition_Moin) return false;
if (!C._Hidden || this.checkBox1.Checked)
{
if (this.Condition_T != 0)
{
long num = C._Bedehi;
if (((((num < 10L) || (this.Condition_T != 1)) && ((num > -10L) || (this.Condition_T != 2))) && (((num <= C._Etebar) || (this.Condition_T != 3)) && (((num <= 10L) && (num >= -10L)) || (this.Condition_T != 4)))) && (((num >= 10L) || (num <= -10L)) || (this.Condition_T != 5))) return false;
}
if (!((((C._Code >= this.Condition_Code_From) || (this.Condition_Code_From == 0M)) && ((C._Code <= this.Condition_Code_To) || (this.Condition_Code_To == 0M))))) { return false; }
if ((Condition_Sefaresh) && (!C._HasSefaresh())) return false;
if ((Condition_Beinerah) && (!C._HasBeinerah())) return false;
if (!((C._Faaliat == this.Condition_Faaliat) || (this.Condition_Faaliat == -1L))) { return false; }
long num2;
long? visitor = C._Visitor; num2 = this.Condition_Visitor; if (!((visitor.HasValue && (visitor.Value == num2)) || (num2 == -1L))) return false;
long? faaliat = C._Faaliat; num2 = this.Condition_Faaliat; if (!((faaliat.HasValue && (faaliat.Value == num2)) || (num2 == -1L))) return false;
long? malekiat = C._Malekiat; num2 = this.Condition_Malekiat; if (!((malekiat.HasValue && (malekiat.Value == num2)) || (num2 == -1L))) return false;
long? mantaghe = C._Mantaghe; num2 = this.Condition_Mantaghe; if (!((mantaghe.HasValue && (mantaghe.Value == num2)) || (num2 == -1L))) return false;
long? masir = C._Masir; num2 = this.Condition_Masir; if (!((masir.HasValue && (masir.Value == num2)) || (num2 == -1L))) return false;
if (TextSearchCriteria_Name != null)
{
if (!C._Name.Contains(TextSearchCriteria_Name)) return false;
}
if (TextSearchCriteria_Address != null)
{
if (!C._Address.Contains(TextSearchCriteria_Address)) return false;
}
if (TextSearchCriteria_Froshgah != null)
{
if (C._Froshgah == null) return false;
if (!C._Froshgah.Contains(TextSearchCriteria_Froshgah )) return false;
}
if (TextSearchCriteria_Tel != null)
{
if (C._Tel == null) return false;
if (!C._Tel.Contains(TextSearchCriteria_Tel)) return false;
}
if (TextSearchCriteria_Mobile != null)
{
if (C._Mobile == null) return false;
if (!C._Mobile.Contains(TextSearchCriteria_Mobile)) return false;
}
return true;
}
return false;
}
نظرتون راجع به روش من چیه؟
(3 سال تجربه + 1 سال طراحی)
نقل قول: به جای متد find در dataview چه راهکاری پیشنهاد می شه
از همتون متشکرم ..
راهکارهای ارائه شده خیلی خوب و جذاب بودن
مشکل منم با این چند خط کد حل شد
dv.RowFilter = "id like '859*'";
dataGridView1.DataBindings.Clear();
dataGridView1.DataSource = dv;
که dv اینجا یک dataview هستش که اطلاعات رو از یک dataset گرفته
متشکرم
سال خوبی داشته باشد
نقل قول: به جای متد find در dataview چه راهکاری پیشنهاد می شه
con.Open();
strSql = "SELECT * FROM Contacts WHERE TellHome Like '%" + txtFind.Text + "%' OR " +
"TellMobile1 like '%" + txtFind.Text + "%' OR " + "TellMobile2 like '%" + txtFind.Text + "%' OR " +
"TellJob like '%" + txtFind.Text + "%'";
da.SelectCommand.CommandText = strSql;
da.SelectCommand.ExecuteNonQuery();
ds.Clear();
da.Fill(ds, "Contacts");
con.Close();
con-->connection
da-->DataAdaptor
ds-->Dataset
نقل قول: به جای متد find در dataview چه راهکاری پیشنهاد می شه
نقل قول:
con.Open();
strSql = "SELECT * FROM Contacts WHERE TellHome Like '%" + txtFind.Text + "%' OR " +
"TellMobile1 like '%" + txtFind.Text + "%' OR " + "TellMobile2 like '%" + txtFind.Text + "%' OR " +
"TellJob like '%" + txtFind.Text + "%'";
da.SelectCommand.CommandText = strSql;
da.SelectCommand.ExecuteNonQuery();
ds.Clear();
da.Fill(ds, "Contacts");
con.Close();
SqlInjectionUnhandledException up = new SqlInjectionUnhandledException();
throw up;