PDA

View Full Version : سوال: نمایش یک فرم در محل خاصی از فرم دیگر



elahe1364
یک شنبه 10 خرداد 1388, 11:25 صبح
سلام دوستان
من یه DATAGRIDVIEW دارم . زمانیکه روی سلول 3 گرید کلیک میشه یه فرم خیلی کوچک باز میشه که کاربر از اون رکوردی رو انتخاب میکنه و اطلاعات اون رکورد داخل سلول گرید میشینه.

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

SMRAH1
یک شنبه 10 خرداد 1388, 12:30 عصر
سلام

1) اول توسط متد GetCellDisplayRectangle از DataGridView می تونی مکان دقیق سلول رو بدست آوری.
2) بعد از نمونه سازی فرم باید از مقدار Location فرم رو به مکان مناسب تنظیم کنی (البته حتما خاصیت startPosition فرم رو Manual کرده باشی).مثلا در کد زیر فرم در مکان 10 و 10 صفحه نمایش دیده می شه.

Form1 f = new Form1();
f.StartPosition = FormStartPosition.Manual
f.Location = new System.Drawing.Point(10, 10);
f.ShowDialog();

موفق باشی

elahe1364
دوشنبه 11 خرداد 1388, 12:37 عصر
ممنون دوست عزیز
من این کد رو به این شکل وارد کردم ولی فرم دوم رو هردفعه یه جایی نشون میده.


bool cut = false;
Rectangle re = DGV.GetCellDisplayRectangle(5, DGV.CurrentRow.Index, cut);
Frm F1 = new Frm();
F1.StartPosition = FormStartPosition.Manual;
F1.Location = new System.Drawing.Point(re.X, re.Y);
F1.ShowDialog();

kitaro
دوشنبه 11 خرداد 1388, 15:32 عصر
این کد همون چیزیه که می خوای:



private void DataGrid1_CellClick(object sender, DataGridViewCellEventArgs e)
{
Rectangle re = DataGrid1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true);
Point b = PointToScreen(DataGrid1.Location);

Form2 frm = new Form2();

frm.Left = b.X + re.Location.X;
frm.Top = b.Y + re.Location.Y;

frm.ShowDialog();
}


فقط باید توجه داشته باشی که DataGrid رو نباید توی هیچ Containerی مانند Panel بندازی.
ولی اگه گذاشتی هم مشکلی نداره فقط در اون صورت باید مختصات Client اون Panel رو هم با Left و Top فرم جمع کنی.
به این صورت:


frm.Left = b.X + re.Location.X + panel1.Location.X;
frm.Top = b.Y + re.Location.Y + panel1.Location.Y;


خلاصه دیگه هر مانوری بخوای می تونی بدی. این مثال فرم رو درست روی سلول کلیک شده باز می کنه.
اگه بخوای زیر سلول کلیک شده باز بشه باید به عبارت frm.Top مقدار re.Top رو اضافه کنی.
به این شکل:


frm.Left = b.X + re.Location.X + panel1.Location.X;
frm.Top = b.Y + re.Location.Y + panel1.Location.Y + re.Top;


و الی آخر...... ;)

rezatati
دوشنبه 11 خرداد 1388, 16:36 عصر
البته با متد ShowDialog() فرم جداگانه باز میشه که این فکر کنم برای کار شما مناسب نیست

به همین خاطر فرم دوم رو رو فرم اولی Add کن یعنی اینطوری :


frm.TopLevel = false;
frm.Location = new Point(0,0);
FirstForm.Controls.Add(frm);
frm.Show();

elahe1364
پنج شنبه 21 خرداد 1388, 11:03 صبح
دوست عزیز من روش شما رو تست کردم ولی فرم رو اون طوری که من میخوام نشون نمیده.

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

اینم کد من

Rectangle re = DGV.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true);
El_FrmNumCheque F1 = new El_FrmNumCheque();
F1.FaRow = Farow;
F1.StartPosition = FormStartPosition.Manual;
F1.Left = re.Location.X + F1.Width;
F1.Top = re.Location.Y + re.Width + F1.Height + 10;
F1.ShowDialog();

kitaro
سه شنبه 09 تیر 1388, 13:07 عصر
دوست عزیز من روش شما رو تست کردم ولی فرم رو اون طوری که من میخوام نشون نمیده.

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

اینم کد من

Rectangle re = DGV.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true);
El_FrmNumCheque F1 = new El_FrmNumCheque();
F1.FaRow = Farow;
F1.StartPosition = FormStartPosition.Manual;
F1.Left = re.Location.X + F1.Width;
F1.Top = re.Location.Y + re.Width + F1.Height + 10;
F1.ShowDialog();


دوست عزیر اگه منظورتون کد منه که اصلا ربطی با کد شما نداره. این تیکه توش نیست!!

Point b = PointToScreen(DGV.Location);

شما باید مختصات DataGrid رو نسبت به کل صفحه بدست بیاری بعد با اون مختصات کار کنی.

elahe1364
یک شنبه 25 مرداد 1388, 08:33 صبح
این کد تقریبا شبیه کد دوستان هست ولی خیلی دقیق نشون میده.

DataGridViewCell cc = this.DGV.CurrentCell;
Point pt =
this.DGV.GetCellDisplayRectangle(cc.ColumnIndex,cc .RowIndex, true).Location;
pt = DGV.PointToScreen(pt);
Form1 f = new Form1();
f.StartPosition = FormStartPosition.Manual;
f.Location = pt;
f.ShowDialog();