PDA

View Full Version : کاری عجیب در DataGraidView



jas1387
پنج شنبه 29 بهمن 1388, 20:54 عصر
با سلام خدمت دوستان عزیز

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



private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
viewPersentBindingSource.Filter = "ID=" + dataGridView1.CurrentRow.Cells[0].Value + "";
DataRow dr = (((DataRowView)viewPersentBindingSource.Current).R ow);
boxName.Text =dr.ItemArray[1].ToString();
boxFather.Text = dr.ItemArray[2].ToString();

}

slashslash2009
پنج شنبه 29 بهمن 1388, 21:28 عصر
احتمالا دیتا تیبلت اینجا در این کد به هم میریزه اینم مشکوک میخوره فکر کمیکنم چون متغیراتو public گرفتی کد پر کردن گرید ویوتم بزار
DataRow dr

s.Jabbari
پنج شنبه 29 بهمن 1388, 21:37 عصر
شاید این راه بهتر باشه!!

تو رویداد cellclick گرید اینو بنویس


textBox1.Text = datagridview1.CurrentRow.Cells[0].Value.ToString();
textBox2.Text = datagridview1.CurrentRow.Cells[1].Value.ToString();
textBox3.Text = datagridview1.CurrentRow.Cells[2].Value.ToString();

slashslash2009
پنج شنبه 29 بهمن 1388, 21:50 عصر
این خیلی بهتره همیشه آسونترین راه بهترین راهه

jas1387
پنج شنبه 29 بهمن 1388, 23:04 عصر
چون متغیراتو public گرفتی کد پر کردن گرید ویوتم بزار
DataRow dr

این کد پر کردن دیتاگرید



this.view_PersentTableAdapter.Fill(this.DS.View_Pe rsent);


ببخشید من منظورتون را رابطه با متغیرها متوجه نمی شوم که چه متغیری منظورتون هست ؟

jas1387
پنج شنبه 29 بهمن 1388, 23:15 عصر
شاید این راه بهتر باشه!!

تو رویداد cellclick گرید اینو بنویس


textBox1.Text = datagridview1.CurrentRow.Cells[0].Value.ToString();
textBox2.Text = datagridview1.CurrentRow.Cells[1].Value.ToString();
textBox3.Text = datagridview1.CurrentRow.Cells[2].Value.ToString();


درست این کد کار می کنه و من هم وقتی به مشکل خوردم از این کد استفاده کردم و خودمون هستم " کلاه سر خود گذاشتن هست " ، حالا کاش با این کار همه مشکل ها حل می شد.

مشکل دیگه ای هست و سر منشاء آن از مشکل قبلی است ( البته من فکر می کنم )

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





view_PersentTableAdapter.Search(DS.View_Persent, (long)ID, boxDate.Text);
if (ds.Tables["View_Persent"].Rows.Count == 0)
{
presentTableAdapter.Insert(ID, (long)cmbDay.SelectedValue, boxDate.Text, boxEntrytime.Text, boxExittime.Text);
view_PersentTableAdapter.Fill(DS.View_Persent);
}
else
{
MessageBox.Show("ورودشخصموردنظرقبلاثبتشدها ست", " ", MessageBoxButtons.OK, MessageBoxIcon.Information);

}




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





for (int i = 0; dataGridView1.Rows.Count > i; i++)


{


if ((long)dataGridView1.Rows[i].Cells[1].Value == ID && dataGridView1.Rows[i].Cells[6].Value.ToString().Trim() == boxDate.Text.Trim())


{


MessageBox.Show("ورود شخص مورد نظر قبلا ثبت شده است", " ", MessageBoxButtons.OK, MessageBoxIcon.Information);


return;


}



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

slashslash2009
پنج شنبه 29 بهمن 1388, 23:41 عصر
منظورم همون datarow, datattable و بقیه موارد بود به نظرم دارید هم در پرکردن گرید ویو ازشون استفاده میکنید هم در فیلتر کردن

jas1387
پنج شنبه 29 بهمن 1388, 23:47 عصر
الان من کل کدم را می گذارم ، لطفا صبر کنید ...

jas1387
پنج شنبه 29 بهمن 1388, 23:53 عصر
این هم از کدها :





private void frmPresent_Load(object sender, EventArgs e)



{



// TODO: This line of code loads data into the 'DS.View_Persent' table. You can move, or remove it, as needed.



this.view_PersentTableAdapter.Fill(this.DS.View_Pe rsent);

}



private void btnSave_Click(object sender, EventArgs e)



{



view_PersentTableAdapter.Search(DS.View_Persent, (long)ID, boxDate.Text); view_PersentTableAdapter.Search(DS.View_Persent, (long)ID, boxDate.Text);



if (ds.Tables["View_Persent"].Rows.Count == 0)



{



presentTableAdapter.Insert(ID, (long)cmbDay.SelectedValue, boxDate.Text, boxEntrytime.Text, boxExittime.Text);



view_PersentTableAdapter.Fill(bacijDS.View_Persent );



}



else



{



MessageBox.Show("ورودشخصموردنظرقبلاثبتشدها ست", " ", MessageBoxButtons.OK, MessageBoxIcon.Information);



}



}



private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)



{



viewPersentBindingSource.Filter = "ID=" + dataGridView1.CurrentRow.Cells[0].Value + "";



DataRow dr = (((DataRowView)viewPersentBindingSource.Current).R ow);



boxName.Text = dr.ItemArray[1].ToString();



boxFather.Text = dr.ItemArray[2].ToString();

}


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

cimiarnm
جمعه 30 بهمن 1388, 00:14 صبح
سلام . دوست عزیز . در مورد متد search ای که بکار برده اید من کار نکرده ام و دقیقا طرز کارش رو نمیدونم ولی اون چیزی که منطقا به ذهن میرسه اینه که فراخوانی این متد عملیات سرچ را انجام میدهد با پارامترهای مورد نظر شما و مسلما خروجی فقط شامل نتایج خواهند بود و بقیه موارد حذف خواهند شد. من فکر کنم مشکل شما به این خط مربوط است که با سرچ دیتا گرید بقیه رکوردها که شامل شرایط نیستند از گردونه نتایج حذف و دیتا گرید به طور اتوماتیک بروز میشود( برای امتحان میتونی شرط رو گسترده تر کنی تا مثلا دو تا ردیف رو شامل شه ببینی آیا دو تا ردبف میمونه یا بازم همشون جز یکی حذف میشه)

jas1387
جمعه 30 بهمن 1388, 00:17 صبح
من الان هنگ کردم ، هم حرف شما درست هست دوست عزیز هم من با این روش چند برنامه نوشتم و به غیر از این مورد مشکلی نداشتم.

cimiarnm
جمعه 30 بهمن 1388, 00:55 صبح
من الان هنگ کردم ، هم حرف شما درست هست دوست عزیز هم من با این روش چند برنامه نوشتم و به غیر از این مورد مشکلی نداشتم.
دوست عزیز حرف شما درست است .کدتان رو با دقت بیشتری بررسی کردم. متد سرچ فقط سرچ میکند و نتیجه رو بر میگرداند . حالا مشکل شما رو تا حالت دارد . اول اینکه داخل دستور if جای insert و fill را عوض کنید یعنی دستورات فوق را جابه جا کنید اگر حل نشد من هم مثل شما هنگ میکنم !!

jas1387
جمعه 30 بهمن 1388, 01:12 صبح
جای insert و fill را عوض کنید یعنی دستورات فوق را جابه جا کنید اگر حل نشد من هم مثل شما هنگ میکنم !!

عزیز من دستور insert یک رکورد به جدول اضافه می کنه و fill برای refresh شدن دیتاگرید هست تا رکورد جدید را نشان بدهد

با این وجود امتحان کردم کار نکرد ، بازم ممنون که راهنمایی کردی

ayyub492
جمعه 30 بهمن 1388, 01:51 صبح
با سلام.
طبق کد شما، dataview فلیتر می شود و تنها یک سطر باقی می ماند. در هنگام دابل کلیک کردن ، dataview دارای یک سطر است. چون دیتا گرید شما به dataview وصل است در نتیجه دیتاگرید سطر فلیتر شده را نشان می دهد.(currencymanager) کار خودش را انجام می دهد.

ayyub492
جمعه 30 بهمن 1388, 01:55 صبح
با سلام.
طبق کد شما، dataview فلیتر می شود و تنها یک سطر باقی می ماند. در هنگام دابل کلیک کردن ، dataview دارای یک سطر است. چون دیتا گرید شما به dataview وصل است در نتیجه دیتاگرید سطر فلیتر شده را نشان می دهد.(currencymanager) کار خودش را انجام می دهد.