PDA

View Full Version : سوال: مشکل نمایش داده جستجو شده بر روی datagiridview



tehranihosseini
یک شنبه 18 تیر 1391, 22:59 عصر
سلام

من یک فرم جستجو دارم که 2تا combobox و یک textbox دارد.
کمبو باکس اول نوع که کتاب،جزوه،دیسک است را مشخص می کند و کمبو باکس دوم اساس جستجو که برای کتب بر اساس نام نویسنده،نام مترجم،نام ناشر و موضوع است.
اما table کتاب جدا،table مترجم جدا،table موضوع هم جدا است.
من یک بر نامه نوشتم که وقتی شخص نوع و اساس جستجو را از این دو کمبو باکس انتخاب کرد اسمی که در textbox جستجو می کند را بر روی گرید ویو نمایش بدهد.
اما فقط جدول خالی را نمایش می دهد و داده های درون آن را نمی آورد!!!!!
لطفاً کمکم کنید.
این هم کد هایی که برای دو تا از این ها نوشتم در قسمت textchanged ،تکس باکسم.

tehranihosseini
یک شنبه 18 تیر 1391, 23:03 عصر
89418http://barnamenevis.org/images/misc/pencil.png

aslan
یک شنبه 18 تیر 1391, 23:24 عصر
سلام
query بنظر اشتباه میاد بخصوص ( like ' select IdTranslator .....(

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

veniz2008
یک شنبه 18 تیر 1391, 23:27 عصر
سلام،شما بین جداولتون ارتباط برقرار کردید؟وقتی قراره با چندتا جدول کار کنید از دستور inner join استفاده کنید.

tehranihosseini
دوشنبه 19 تیر 1391, 10:51 صبح
سلام
دوست عزیز با inner join هم امتحان کردم اما این بار هم فقط جدول خالی را آورد!!!!!!!!!!

veniz2008
دوشنبه 19 تیر 1391, 11:00 صبح
اگر بین جدول ها ارتباط برقرار نکرده باشید دستور inner join کارایی نداره،یه عکس از ارتباط بین جدول ها بگیر و اینجا بزار (یعنی از قسمت دیاگرام).

veniz2008
دوشنبه 19 تیر 1391, 11:02 صبح
http://itpeach.net/tuts/programming-tuts/c-sharp/c-sharp-step-by-step/
مراجعه کنید
چه ربطی داشت؟؟؟

tooraj_azizi_1035
دوشنبه 19 تیر 1391, 11:18 صبح
سلام
دوست من با فرض اینکه شما یک کوئری نوشتید که اطلاعاتی رو از سه جدول در گرید نمایش می ده که این مستلزمه join هست می تونید به راحتی با استفاده از خاصیت BindingSource.Filter نام فیلد ها را ذکر کنید و مقدار دو کمبو باکس و TextBox رو به اون اضافه کنید:



Bindingsource1.Filter = String.Format("Field1= {0}" +
TextBox1.Text+" AND Field2= {1}"+ComboBox1.Text);

tehranihosseini
دوشنبه 19 تیر 1391, 14:43 عصر
بین جدول ها ارتباط است.
tblBook:TitleBook,IdBook,IdWriter,IdSubject,IdTran slator,CodeShabak,Publisher,Language,CountBook
tblWriter:IdWriter,Writer
tblTrans:IdTranslator,Translator
tblSubject:IdSubject,Subject
در tblbook ،IdBook
در tblWriter،IdWriter
در tvlTrans،IdTranslator
در tblSubject،IdSubject
کلید می باشند
من این کد ها را برای IdSubject نوشتم اما بر اساس کد کتابجستجو می کند.
حتی بر اساس TitleBook که در جدول کتاب است هم جستجو نمی کند.
من این کد ها را در SQL تست کردم درست کار می کند.

tehranihosseini
دوشنبه 19 تیر 1391, 14:53 عصر
89437
این کد هایی که برای کتاب و کد موضوع نوشتم.

tehranihosseini
دوشنبه 19 تیر 1391, 18:12 عصر
اگه کسی می تونه لطفاً کمکم کنه چون فقط 2 روز وقت دارم تا پروژه ام را تحویل بدهم.

veniz2008
دوشنبه 19 تیر 1391, 18:44 عصر
شما گفتید بین جدول هاتون ارتباط هست،یه لطف کن از قسمت دیاگرام یه عکس از جدول ها بگیر و بزار تا مطمئن شیم که مشکل از سمت sql نباشه. چون کدنویسی اینجور گزارش ها کار ساده ای هستش.

tehranihosseini
دوشنبه 19 تیر 1391, 20:02 عصر
این هم دیاگرام این سه جدول دوست عزیز89455

aslan
دوشنبه 19 تیر 1391, 21:07 عصر
سلام

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

1- query مناسب را بدون فیلتر ( where) بنویسید و روی sql server اجرا کنید . در صورتیکه جواب گرفتین
2 - شرط فیلتر را در query منظور و روی sqlserver اجرا کنید
.
.
.
لذا پیشنهاد میشود :


Select * From tblBook B
Left Outer Join tblWriter W ON B.IdWriter=W.IdWriter
INNER JOIN tblTrans T ON B.IdTranslator=T.IdTranslator
INNER JOIN tbSubject S ON B.IdSubject=S.IdSubject



سپس بخش Where مناسب را داخل query کنید و روی sqlServer تست کنید
برای راحتی کار ( و یا شاید برای خوانایی Query ) میتوانید عناوین ستونهای datagridview را بعدا و مستقیم روی گرید اعمال کنید و ...

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

veniz2008
دوشنبه 19 تیر 1391, 21:46 عصر
سلام دوست من، راستش نمیدونم چطور شد که تصمیم گرفتم برنامه شما رو بصورت کامل روی سیستم خودم اجرا کنم،واقعا وقت گیر بود ولی امیدوارم که مشکلتون رو حل کنه.
این تمام کدیه که نیاز دارید:

SqlConnection con = new SqlConnection("Data Source = (local); Initial Catalog =Book;Integrated Security = True");
SqlDataAdapter da = new SqlDataAdapter("select tblBook.IdBook,tblBook.TitleBook,tblBook.Publisher ,tblBook.CountBook,tblbook.ShabakCode,tblBook.Lang uage,tblBook.Year,tblSubject.Subject,tblWriter.Wri ter,tblTrans.Translator from tblBook inner join tblSubject on tblBook.IdSubject = tblSubject.IdSubject inner join tblWriter on tblBook.IdWriter = tblWriter.IdWriter inner join tblTrans on tblBook.IdTranslator = tblTrans.IdTranslator where tblBook.IdSubject =" + txtsubject.Text.Trim(), con);
DataTable dt = new DataTable();
da.Fill(dt);
if (dt.Rows.Count != 0)
dataGridView1.DataSource = dt;
else
MessageBox.Show(" هیچ رکوردی یافت نشد");
con.Close();
موفق و شاد و تندرست باشید.

tehranihosseini
دوشنبه 19 تیر 1391, 22:30 عصر
شرمنده دوست عزیز ولی کدمن درsql جواب میده یک تکه از برنامم رو میزارم تا بیشتر متوجه منظورم بشید اگه زودترکمکم کنید ممنونتون میشم

veniz2008
دوشنبه 19 تیر 1391, 23:24 عصر
ببینید من کد کامل رو براتون گذاشتم، دیگه مشکلتون کجاست؟
کدهایی رو که واستون گذاشتم درون دکمه بذارید.
یه textbox روی فرم بزارید و idsubject رو وارد کنید.
همین.
یه تست کنید ضرر نمیکنید. نیازی به کدهای خودتون نیست. در واقع کدهای خودتون ایراد داشتن.
اگر سوال دیگه ای داشتید بپرسید.

aslan
سه شنبه 20 تیر 1391, 02:18 صبح
سلام


namespace search
{
public partial class Form1 : Form
{
string searchQuery;

SqlConnection sc = new SqlConnection("Data Source=.;Initial Catalog=......;Integrated Security=True");
SqlCommand cmd = new SqlCommand();

DataSet ds = new DataSet();
DataTable dt = new DataTable();
BindingSource bind = new BindingSource();
public Form1()
{
InitializeComponent();
}



private void textBox1_TextChanged(object sender, EventArgs e)
{
sc.Open();
string strSql =" Select B.IdBook as [کدکتاب],B.TitleBook as [عنوان کتاب],";
strSql +=" B.Publisher as[ناشر],B.CountBook as[تعداد],";
strSql +=" B.ShabakCode as[کدشابک],B.Language as[زبان],";
strSql +=" B.Year as[سال چاپ],S.Subject as[موضوع],";
strSql +=" W.Writer as[نویسنده],T.Translator as[مترجم] ";
strSql +=" from tblBook B left outer join tblSubject S on B.IdSubject=S.IdSubject ";
strSql +=" INNER join tblWriter W on B.IdWriter=W.IdWriter ";
strSql +=" INNER join tblTrans T on B.IdTranslator=T.IdTranslator ";
string strWhere = "";
if (comboBox1.SelectedIndex == 0)
{
if (comboBox2.SelectedIndex == 0)
strWhere = " Where B.IdBook= " + textBox1.Text.Trim();
if (comboBox2.SelectedIndex == 1)
strWhere = " where B.TitleBook LIKE N'" + textBox1.Text.Trim() + "%'";
if (comboBox2.SelectedIndex == 2)
strWhere = " where (S.Subject LIKE N'" + textBox1.Text.Trim() + "%')";
if (comboBox2.SelectedIndex == 3)
strWhere = " where (B.Publisher LIKE N'" + textBox1.Text.Trim() + "%')";
if (comboBox2.SelectedIndex == 4)
strWhere = " where (W.Writer LIKE N'" + textBox1.Text.Trim() + "%')";
}
else
{
if (comboBox1.SelectedIndex == 1)
{
if (comboBox2.SelectedIndex == 0)
strWhere = " where (W.Writer LIKE N'" + textBox1.Text.Trim() + "%')";
if (comboBox2.SelectedIndex == 1)
strWhere = " where (T.Translator LIKE N'" + textBox1.Text.Trim() + "%')";
if (comboBox2.SelectedIndex == 2)
strWhere = " where (S.Subject LIKE N'" + textBox1.Text.Trim() + "%')";

}
}
searchQuery = strSql + strWhere;
dt.Clear();
SqlDataAdapter da = new SqlDataAdapter(searchQuery, sc);
da.Fill(dt);

dataGridViewsearch.DataSource = dt;
sc.Close();
}

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
comboBox2.Items.Clear();
comboBox2.Text = "";
if (comboBox1.SelectedIndex == 0)
{
comboBox2.Items.Add("کدکتاب");
comboBox2.Items.Add("نام کتاب");
comboBox2.Items.Add("موضوع");
comboBox2.Items.Add("ناشر");
comboBox2.Items.Add("نویسنده");
}
else
if (comboBox1.SelectedIndex == 1)
{
comboBox2.Items.Add("نویسنده");
comboBox2.Items.Add("مترجم");
comboBox2.Items.Add("موضوع");
}
}

}
}


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

tehranihosseini
سه شنبه 20 تیر 1391, 10:11 صبح
دوستان خیلی لطف کردید کارم راه افتاد واقعاً ممنون...:تشویق: