क्या TabControl में टैब को अक्षम करने का कोई तरीका है ?
जवाबों:
TabPage वर्ग सक्षम संपत्ति छुपाता है। यह जानबूझकर था क्योंकि इसके साथ एक अजीब यूआई डिजाइन समस्या है। मूल मुद्दा यह है कि पेज को अक्षम करना भी टैब को अक्षम नहीं करता है। और अगर सेलेक्टिंग इवेंट के साथ टैब को डिसेबल करके उसके आसपास काम करने की कोशिश की जाती है तो यह तब काम नहीं करता है जब टैबकंट्रोल में केवल एक पेज होता है।
यदि ये प्रयोज्य समस्याएं आपको चिंतित नहीं करती हैं, तो ध्यान रखें कि संपत्ति अभी भी काम करती है, यह केवल IntelliSense से छिपी हुई है। यदि FUD असहज है तो आप बस यह कर सकते हैं:
public static void EnableTab(TabPage page, bool enable) {
foreach (Control ctl in page.Controls) ctl.Enabled = enable;
}
अपने TabPage को नियंत्रण में रखें, फिर सक्षम संपत्ति को झूठी पर सेट करें।
((Control)this.tabPage).Enabled = false;
इसलिए, टैबपेज का हेडर अभी भी सक्षम होगा लेकिन इसकी सामग्री अक्षम हो जाएगी।
आप बस का उपयोग कर सकते हैं:
tabPage.Enabled = false;
यह गुण नहीं दिखाया गया है, लेकिन यह बिना किसी समस्या के काम करता है।
TabControler
गैर-संपादन योग्य टैब में परिवर्तन करना असंभव बनाने के लिए आप चयन करने की घटना पर कार्यक्रम कर सकते हैं :
private void tabControler_Selecting(object sender, TabControlCancelEventArgs e)
{
if (e.TabPageIndex < 0) return;
e.Cancel = !e.TabPage.Enabled;
}
Visible
संपत्ति का सच प्रतीत होता है, हालांकि यह वास्तव में कोई दृश्य प्रभाव नहीं है जब मैंने इसका परीक्षण किया।
आप "चयन" घटना को पंजीकृत कर सकते हैं और टैब पृष्ठ पर नेविगेशन रद्द कर सकते हैं:
private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
{
if (e.TabPage == tabPage2)
e.Cancel = true;
}
एक अन्य विचार यह है कि सभी नियंत्रणों को एक पैनल कंट्रोल में टैबपेज पर रखा जाए और पैनल को डिसेबल किया जाए! स्माइली
आप tabControl1.TabPages संग्रह से टैब पृष्ठ भी निकाल सकते हैं। वह टैबपेज छिपा देगा।
श्रेय छोटू @ चैनल 9 को जाता है ।
संभवतया, आप टैब को टैब नियंत्रण में देखना चाहते हैं, लेकिन आप इसे "अक्षम" (यानी, ग्रेय्ड और अचूक) बनाना चाहते हैं। इसके लिए कोई अंतर्निहित समर्थन नहीं है, लेकिन आप वांछित प्रभाव देने के लिए ड्राइंग तंत्र को ओवरराइड कर सकते हैं।
यह कैसे करना है, इसका एक उदाहरण यहां दिया गया है ।
जादू प्रस्तुत स्रोत से इस स्निपेट में है, और DisableTab_DrawItem विधि में:
this.tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed;
this.tabControl1.DrawItem += new DrawItemEventHandler( DisableTab_DrawItem );
आपके द्वारा अक्षम करने के बाद, Cdric Guillemette उत्तर पर विस्तार Control
:
((Control)this.tabPage).Enabled = false;
... तो आप इस तरह TabControl
की Selecting
घटना को संभाल सकते हैं :
private void tabControl_Selecting(object sender, TabControlCancelEventArgs e)
{
e.Cancel = !((Control)e.TabPage).Enabled;
}
यह टैब पृष्ठ को हटा देगा, लेकिन आपको आवश्यकता होने पर इसे फिर से जोड़ना होगा:
tabControl1.Controls.Remove(tabPage2);
यदि आपको बाद में इसकी जरूरत पड़ने वाली है, तो आप इसे हटाने से पहले एक अस्थायी टैबपेज में स्टोर करना चाहते हैं और फिर जरूरत पड़ने पर इसे फिर से जोड़ सकते हैं।
एकमात्र तरीका इस Selecting
घटना को पकड़ना है और एक टैब को सक्रिय होने से रोकना है।
सबसे मुश्किल तरीका यह है कि उसके माता-पिता को अशक्त बनाया जाए (माता-पिता के बिना अकेले टैब बनाएं):
tabPage.Parent = null;
और जब आप इसे वापस करना चाहते हैं (पेज संग्रह के अंत में इसे वापस कर देंगे):
tabPage.Parent = tabControl;
और यदि आप इसे उन विशिष्ट पृष्ठों में वापस लौटना चाहते हैं, जिनका उपयोग आप कर सकते हैं:
tabControl.TabPages.Insert(indexLocationYouWant, tabPage);
आप इसे tabpages: tabPage1.Hide (), tabPage2.Show () आदि के माध्यम से कर सकते हैं।
tabControl.TabPages.Remove (tabPage1);
उपयोगकर्ता को क्लिक करने से रोकने के लिए मैंने अतीत में टैब पृष्ठ हटा दिए हैं। यह शायद सबसे अच्छा समाधान नहीं है, क्योंकि उन्हें यह देखने की आवश्यकता हो सकती है कि टैब पृष्ठ मौजूद है।
ईवेंट, और टैब नियंत्रण के गुणों का उपयोग करके आप जब चाहें तब आप को सक्षम / अक्षम कर सकते हैं। मैंने एक बूल का उपयोग किया जो कि mdi चाइल्ड फॉर्म क्लास के सभी तरीकों के लिए उपलब्ध है जहाँ tabControl का उपयोग किया जा रहा है।
हर बार किसी भी टैब पर क्लिक करते समय चयन करने वाली ईवेंट आग याद रखें। टैब की एक बड़ी संख्या के लिए "CASE", ifs के एक समूह की तुलना में उपयोग करना आसान हो सकता है।
public partial class Form2 : Form
{
bool formComplete = false;
public Form2()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
formComplete = true;
tabControl1.SelectTab(1);
}
private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
{
if (tabControl1.SelectedTab == tabControl1.TabPages[1])
{
tabControl1.Enabled = false;
if (formComplete)
{
MessageBox.Show("You will be taken to next tab");
tabControl1.SelectTab(1);
}
else
{
MessageBox.Show("Try completing form first");
tabControl1.SelectTab(0);
}
tabControl1.Enabled = true;
}
}
}
उपयोगकर्ता नेविगेट करने के लिए टैब पर क्लिक नहीं कर सकता है, लेकिन वे दो बटन ( Nextऔर Back) का उपयोग कर सकते हैं । // शर्तों के पूरा नहीं होने पर उपयोगकर्ता अगले तक जारी नहीं रह सकता है।
private int currentTab = 0;
private void frmOneTimeEntry_Load(object sender, EventArgs e)
{
tabMenu.Selecting += new TabControlCancelEventHandler(tabMenu_Selecting);
}
private void tabMenu_Selecting(object sender, TabControlCancelEventArgs e)
{
tabMenu.SelectTab(currentTab);
}
private void btnNextStep_Click(object sender, EventArgs e)
{
switch(tabMenu.SelectedIndex)
{
case 0:
//if conditions met GoTo
case 2:
//if conditions met GoTo
case n:
//if conditions met GoTo
{
CanLeaveTab:
currentTab++;
tabMenu.SelectTab(tabMenu.SelectedIndex + 1);
if (tabMenu.SelectedIndex == 3)
btnNextStep.Enabled = false;
if (btnBackStep.Enabled == false)
btnBackStep.Enabled = true;
CannotLeaveTab:
;
}
private void btnBackStep_Click(object sender, EventArgs e)
{
currentTab--;
tabMenu.SelectTab(tabMenu.SelectedIndex - 1);
if (tabMenu.SelectedIndex == 0)
btnBackStep.Enabled = false;
if (btnNextStep.Enabled == false)
btnNextStep.Enabled = true;
}
मान लें कि आपके पास ये नियंत्रण हैं:
TabControl नाम tcExemple के साथ।
TpEx1 और tpEx2 नामों के साथ टैबपेज।
कोशिश करो:
OwnerDrawFixed के लिए अपने TabPage का DrawMode सेट करें; InitializeComponent () के बाद, सुनिश्चित करें कि tpEx2 इस कोड को जोड़कर सक्षम नहीं है:
((Control)tcExemple.TabPages["tpEx2").Enabled = false;
नीचे दिए गए कोड में चयन tcExemple ईवेंट में जोड़ें:
private void tcExemple_Selecting(object sender, TabControlCancelEventArgs e)
{
if (!((Control)e.TabPage).Enabled)
{
e.Cancel = true;
}
}
इस कोड को tcExemple के ड्राइइटेम ईवेंट से संलग्न करें:
private void tcExemple_DrawItem(object sender, DrawItemEventArgs e)
{
TabPage page = tcExemple.TabPages[e.Index];
if (!((Control)page).Enabled)
{
using (SolidBrush brush = new SolidBrush(SystemColors.GrayText))
{
e.Graphics.DrawString(page.Text, page.Font, brush, e.Bounds);
}
}
else
{
using (SolidBrush brush = new SolidBrush(page.ForeColor))
{
e.Graphics.DrawString(page.Text, page.Font, brush, e.Bounds);
}
}
}
यह दूसरा टैब गैर-क्लिक करने योग्य बना देगा।
यह एक पुराना सवाल है, लेकिन मेरे अलावा किसी को फायदा हो सकता है। मुझे एक TabControl की आवश्यकता थी जो क्रमिक रूप से छिपे हुए टैब दिखाएगा (वर्तमान टैब पर एक कार्रवाई के बाद)। इसलिए, मैंने लोड करने के लिए HideSuccessive () से वार करने के लिए एक त्वरित वर्ग बनाया:
public class RevealingTabControl : TabControl
{
private Action _showNextRequested = delegate { };
public void HideSuccessive()
{
var tabPages = this.TabPages.Cast<TabPage>().Skip(1);
var queue = new ConcurrentQueue<TabPage>(tabPages);
tabPages.ToList().ForEach(t => t.Parent = null);
_showNextRequested = () =>
{
if (queue.TryDequeue(out TabPage tabPage))
tabPage.Parent = this;
};
}
public void ShowNext() => _showNextRequested();
}
C # 7.0 में, पैटर्न मिलान नाम से एक नई सुविधा है । आप सभी टैब को टाइप पैटर्न के माध्यम से अक्षम कर सकते हैं ।
foreach (Control control in Controls)
{
// the is expression tests the variable and
// assigned it to a new appropriate variable type
if (control is TabControl tabs)
{
tabs.Enabled = false;
}
}
यदि हम लिखते हैं तो फ़ॉर्म लोड घटना में this.tabpage.PageEnabled = false
, टैबपेज अक्षम हो जाएगा।
समाधान बहुत सरल है।
इस लाइन को निकालें / टिप्पणी करें
this.tabControl.Controls.Add(this.YourTabName);
MainForm.cs में IntializeComponent () विधि
मुझे सवाल का उचित जवाब नहीं मिला। विशिष्ट टैब को अक्षम करने का कोई समाधान नहीं दिखता है। मैंने विशिष्ट टैब को एक चर में पारित करने के लिए क्या किया और SelectedIndexChanged
घटना में इसे वापस रखा SelectedIndex
:
//variable for your specific tab
int _TAB = 0;
//here you specify your tab that you want to expose
_TAB = 1;
tabHolder.SelectedIndex = _TAB;
private void tabHolder_SelectedIndexChanged(object sender, EventArgs e)
{
if (_TAB != 0) tabHolder.SelectedIndex = _TAB;
}
इसलिए, आप वास्तव में टैब को अक्षम नहीं करते हैं, लेकिन जब दूसरा टैब क्लिक किया जाता है तो यह आपको हमेशा चयनित टैब पर लौटाता है।