دریافت پارامترهای یک شیء در وضعیت غیرقابل مشاهده/غیرفعال
نویسنده: هادی مزارعی
تاریخ: ۱۴۰۴/۰۵/۱۶ ۲۲:۰۷
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
private void tabControl1_Resize(object sender, EventArgs e)
{
foreach (TabPage t in tabControl1.TabPages)
{
t.PerformLayout();
t.Refresh();
t.Invalidate();
}
}private void Form1_Load(object sender, EventArgs e)
{
// فرم را به حالت Maximize تنظیم کنید
this.WindowState = FormWindowState.Maximized;
// تمام تبها را به ترتیب فعال کنید تا رندر شوند
foreach (TabPage tab in tabControl1.TabPages)
{
tabControl1.SelectedTab = tab; // فعال کردن تب
}
// بازگشت به تب اولیه
tabControl1.SelectedIndex = 0;
// حالا میتوانید Width را بررسی کنید
MessageBox.Show(dataGridViewInTab5.Width.ToString()); // باید مقدار صحیح (700) را نمایش دهد
}PerformLayout به شکل زیر انجام دهید:private void Form1_Load(object sender, EventArgs e)
{
// فرم را به حالت Maximize تنظیم کنید
this.WindowState = FormWindowState.Maximized;
// بهروزرسانی Layout برای تمام تبها
foreach (TabPage tab in tabControl1.TabPages)
{
tabControl1.SelectedTab = tab; // فعال کردن تب برای اطمینان از رندر
tab.PerformLayout(); // اجبار به محاسبه Layout
foreach (Control ctrl in tab.Controls)
{
ctrl.PerformLayout(); // اجبار به محاسبه Layout برای کنترلهای داخل تب
}
}
// بازگشت به تب اولیه
tabControl1.SelectedIndex = 0;
// بررسی Width
MessageBox.Show(dataGridViewInTab5.Width.ToString()); // باید مقدار صحیح (700) را نمایش دهد
}SuspendLayout و ResumeLayout برای بهینهسازی فرآیند استفاده کنید:private void Form1_Load(object sender, EventArgs e)
{
// فرم را به حالت Maximize تنظیم کنید
this.WindowState = FormWindowState.Maximized;
// توقف موقت Layout
tabControl1.SuspendLayout();
// فعال کردن تمام تبها برای رندر
foreach (TabPage tab in tabControl1.TabPages)
{
tabControl1.SelectedTab = tab;
tab.PerformLayout();
}
// بازگشت به تب اولیه
tabControl1.SelectedIndex = 0;
// از سرگیری Layout
tabControl1.ResumeLayout(true);
// بررسی Width
MessageBox.Show(dataGridViewInTab5.Width.ToString()); // باید مقدار صحیح (700) را نمایش دهد
}Resize خوب است، اما ممکن است به دلیل زمانبندی اجرا (قبل از رندر کامل کنترلها) کار نکند. به جای آن، میتوانید این کار را در رویداد Shown فرم انجام دهید که پس از نمایش کامل فرم اجرا میشود:private void Form1_Shown(object sender, EventArgs e)
{
// فرم به حالت Maximize تنظیم شده است
this.WindowState = FormWindowState.Maximized;
// بهروزرسانی Layout برای تمام تبها
foreach (TabPage tab in tabControl1.TabPages)
{
tabControl1.SelectedTab = tab;
tab.PerformLayout();
}
// بازگشت به تب اولیه
tabControl1.SelectedIndex = 0;
// بررسی Width
MessageBox.Show(dataGridViewInTab5.Width.ToString()); // باید مقدار صحیح (700) را نمایش دهد
}PerformLayout، Refresh و Invalidate به تنهایی کافی نیست، زیرا تبهای غیرفعال هنوز رندر نشدهاند. باید ابتدا تب را فعال کنید تا کنترلهای داخل آن بارگذاری شوند.SuspendLayout و ResumeLayout میتواند عملکرد را بهبود ببخشد.TabControl.SelectedIndexChanged).Form1_Load یا Form1_Shown قرار دهید و بررسی کنید که آیا Width صحیح (700) برگردانده میشود یا خیر:private void Form1_Load(object sender, EventArgs e)
{
this.WindowState = FormWindowState.Maximized;
tabControl1.SuspendLayout();
foreach (TabPage tab in tabControl1.TabPages)
{
tabControl1.SelectedTab = tab;
tab.PerformLayout();
}
tabControl1.SelectedIndex = 0;
tabControl1.ResumeLayout(true);
MessageBox.Show(dataGridViewInTab5.Width.ToString()); // باید 700 باشد
}CesGridView و CesGridViewPro در درون خودشان این صفحه را در زمان دریافت DataSource نمایش و در پایان حذف میکردند (البته با تنظیم کاربر).ComboBox باید دادههای مربوط به هر DataGridView در تمام Tabها بروزرسانی شود و چون CesLoadScreen موقعیت DGV رو نداشت، در موقعیت و اندازه ناصحیح نمایش داده میشد (بصورت Modal در فرم جاری نمایش داده میشد). و این کار باعث میشد کاربر چندین LoadScreen که بدون هدف در صفحه وجود داشت را مشاهده کند که قطعا حس خوبی را تجربه نمیکرد.Handle برای کنترلهایی که هنوز در Tabهای غیرفعال وجود دارند عنوان کرده. بنابراین در کدهای برنامه و در جایی که باید CesLoadScreen نمایش داده شود متد IsVisible دو فاکتور را بررسی خواهد کرد:Handle میباشد یا خیر (IsHandleCreated).Handle، کنترل در صفحه قابل رویت است؟ چون ممکن است توسط هر شیء یا فرم و... پوشانده شود.LoadScreen (با وجود در دسترس بودن ابعاد نهایی) جلوگیری شده استpublic static Form Create(
Control control,
bool coverParentContainer = true,
bool coverParentForm = false,
string title = "Loading...",
double opacity = 0.5)
{
var frm = new CesLoadScreen();
frm._title = title;
frm.Opacity = opacity;
if (!IsVisible(control))
return frm;
SetLoadingScreenSize(frm, coverParentContainer, coverParentForm, control);
control.Resize += (s, e) => SetLoadingScreenSize(frm, coverParentContainer, coverParentForm, control);
frm.Show(control.FindForm());
Application.DoEvents();
return frm;
}
public static bool IsVisible(Control control)
{
Rectangle screenBounds = Screen.FromControl(control).Bounds;
Rectangle controlBounds = control.RectangleToScreen(control.ClientRectangle);
bool isOnScreen = screenBounds.IntersectsWith(controlBounds);
if (!control.IsHandleCreated || !isOnScreen)
return false;
if (!control.Visible)
return false;
return true;
}