मैं TabControl के अंदर एक टैब को कैसे निष्क्रिय कर सकता हूं?


जवाबों:


71

TabPage वर्ग सक्षम संपत्ति छुपाता है। यह जानबूझकर था क्योंकि इसके साथ एक अजीब यूआई डिजाइन समस्या है। मूल मुद्दा यह है कि पेज को अक्षम करना भी टैब को अक्षम नहीं करता है। और अगर सेलेक्टिंग इवेंट के साथ टैब को डिसेबल करके उसके आसपास काम करने की कोशिश की जाती है तो यह तब काम नहीं करता है जब टैबकंट्रोल में केवल एक पेज होता है।

यदि ये प्रयोज्य समस्याएं आपको चिंतित नहीं करती हैं, तो ध्यान रखें कि संपत्ति अभी भी काम करती है, यह केवल IntelliSense से छिपी हुई है। यदि FUD असहज है तो आप बस यह कर सकते हैं:

public static void EnableTab(TabPage page, bool enable) {
    foreach (Control ctl in page.Controls) ctl.Enabled = enable;
}

3
मुझे आश्चर्य है कि टैब विजिबिलिटी को टॉगल नहीं करने के लिए पीछे की कहानी क्या है
शशांक शेखर

91

अपने TabPage को नियंत्रण में रखें, फिर सक्षम संपत्ति को झूठी पर सेट करें।

((Control)this.tabPage).Enabled = false;

इसलिए, टैबपेज का हेडर अभी भी सक्षम होगा लेकिन इसकी सामग्री अक्षम हो जाएगी।


3
मुझे लगता है कि यह टैब को अक्षम करने के बिंदु को याद करता है, स्वयं। उपयोगकर्ता को इसका चयन करने और सामग्री को देखने में सक्षम नहीं होना चाहिए।
ThunderGr

3
हो सकता है कि यह आपके उपयोग का मामला हो लेकिन मुझे लगता है कि यह उपयोगी है अगर टैब को केवल कुछ अधिकारों की वजह से पढ़ा जाना चाहिए।
सेड्रिक गुइलमेटे

9
TabPage को नियंत्रित करने के लिए डाउनकास्टिंग की आवश्यकता क्यों है? हम बहुरूपता के कारण TabPage से सक्षम संपत्ति का आह्वान कर सकते हैं।
एल्डारल एगरोव

1
यकीन नहीं होता कि यह कभी अलग था लेकिन आज यह पूरी तरह से बकवास है। गलत में 69 upvoters। आउच ..
ताव

1
@TaW यह प्रश्न विशेष रूप से और संक्षिप्त रूप से प्रश्न का उत्तर देता है। "टैबकॉर्नोल में टैब को अक्षम करने का कोई तरीका है?" वे यह नहीं पूछते कि टैब को कैसे छिपाया जाए। सही में 69 upvoters ... 1 टिप्पणीकार जो गलत में सवाल नहीं पढ़ता था। आउच ...
डीडीफ़ी

70

आप बस का उपयोग कर सकते हैं:

tabPage.Enabled = false;

यह गुण नहीं दिखाया गया है, लेकिन यह बिना किसी समस्या के काम करता है।

TabControlerगैर-संपादन योग्य टैब में परिवर्तन करना असंभव बनाने के लिए आप चयन करने की घटना पर कार्यक्रम कर सकते हैं :

private void tabControler_Selecting(object sender, TabControlCancelEventArgs e)
{
    if (e.TabPageIndex < 0) return;
    e.Cancel = !e.TabPage.Enabled;
}

3
यह कितना विचित्र है .. यह भी Visibleसंपत्ति का सच प्रतीत होता है, हालांकि यह वास्तव में कोई दृश्य प्रभाव नहीं है जब मैंने इसका परीक्षण किया।
अल्फी

@Alfie इसकी वजह है कि TabPage को निम्नलिखित पदानुक्रम से विरासत में मिला है: नियंत्रण> स्क्रॉल करने योग्य कंट्रोलर> पैनल> TabPage, सक्षम, दृश्यमान आदि व्यवहार बहुरूपी है।
मास्टर योदा

50

आप "चयन" घटना को पंजीकृत कर सकते हैं और टैब पृष्ठ पर नेविगेशन रद्द कर सकते हैं:

private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
{
    if (e.TabPage == tabPage2)
        e.Cancel = true;
}

एक अन्य विचार यह है कि सभी नियंत्रणों को एक पैनल कंट्रोल में टैबपेज पर रखा जाए और पैनल को डिसेबल किया जाए! स्माइली

आप tabControl1.TabPages संग्रह से टैब पृष्ठ भी निकाल सकते हैं। वह टैबपेज छिपा देगा।

श्रेय छोटू @ चैनल 9 को जाता है


अधिक पूर्ण और मेरे द्वारा पोस्ट किया जाना चाहिए :)
मार्टिज़न लर्मन

यह एक खूनी शानदार समाधान है !!
कॉर्नेलियस

13

संभवतया, आप टैब को टैब नियंत्रण में देखना चाहते हैं, लेकिन आप इसे "अक्षम" (यानी, ग्रेय्ड और अचूक) बनाना चाहते हैं। इसके लिए कोई अंतर्निहित समर्थन नहीं है, लेकिन आप वांछित प्रभाव देने के लिए ड्राइंग तंत्र को ओवरराइड कर सकते हैं।

यह कैसे करना है, इसका एक उदाहरण यहां दिया गया है

जादू प्रस्तुत स्रोत से इस स्निपेट में है, और DisableTab_DrawItem विधि में:

this.tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed;
this.tabControl1.DrawItem += new DrawItemEventHandler( DisableTab_DrawItem );

1
उदाहरण लिंक अब मृत प्रतीत होता है।
Narthring

1
@ नोटिंग - धन्यवाद, मैंने एक काम करने के लिए लिंक को प्रतिस्थापित किया है।
स्टीवर्ट

2
@Nththring यह फिर से मर चुका है।
सुकसा

यह इस प्रश्न का "वास्तविक" उत्तर है। Waybackmachine से मृत लिंक का एक रिकॉर्ड है: [ web.archive.org/web/20131102065816/http://…
जो उह्रेन

इस उत्तर में एक सुधार ... आपके प्रत्येक टैब में एक EnabledChanged ईवेंट-हैंडलर जोड़ें , और टैब-नियंत्रण पर ईवेंट-हैंडलर कॉल अमान्य () है । इस तरह, पाठ-रंग स्वचालित रूप से अपडेट हो जाएगा।

12

आपके द्वारा अक्षम करने के बाद, Cdric Guillemette उत्तर पर विस्तार Control:

((Control)this.tabPage).Enabled = false;

... तो आप इस तरह TabControlकी Selectingघटना को संभाल सकते हैं :

private void tabControl_Selecting(object sender, TabControlCancelEventArgs e)
{
    e.Cancel = !((Control)e.TabPage).Enabled;
}

8

यह टैब पृष्ठ को हटा देगा, लेकिन आपको आवश्यकता होने पर इसे फिर से जोड़ना होगा:

tabControl1.Controls.Remove(tabPage2);

यदि आपको बाद में इसकी जरूरत पड़ने वाली है, तो आप इसे हटाने से पहले एक अस्थायी टैबपेज में स्टोर करना चाहते हैं और फिर जरूरत पड़ने पर इसे फिर से जोड़ सकते हैं।


मुझे लगता है कि यह पूरी तरह से काम करता है जब आप फॉर्म की लोड घटना पर जांच करना चाहते हैं, अगर उपयोगकर्ता इस टैब तक पहुंचने के लिए योग्य है और यदि नहीं, तो बस इसे हटा दें।
थंडरग्रास


2

सबसे मुश्किल तरीका यह है कि उसके माता-पिता को अशक्त बनाया जाए (माता-पिता के बिना अकेले टैब बनाएं):

 tabPage.Parent = null;

और जब आप इसे वापस करना चाहते हैं (पेज संग्रह के अंत में इसे वापस कर देंगे):

tabPage.Parent = tabControl;

और यदि आप इसे उन विशिष्ट पृष्ठों में वापस लौटना चाहते हैं, जिनका उपयोग आप कर सकते हैं:

tabControl.TabPages.Insert(indexLocationYouWant, tabPage);

1
इसका काम अच्छा है! :)..मेरा एक सवाल है। जब हम इसे वापस लाते हैं तो टैककंट्रोल इसके अंतिम इंडेक्स को जोड़ देता है। हम अपने प्रारंभिक चरण से एक ही सूचकांक में टैबपेज को कैसे जोड़ते हैं।
User6667769

2
यदि आप इसे वापस उस स्थान पर लौटना चाहते हैं जिसे आप चाहते हैं (अंत में नहीं), तो उपयोग करें: tabControl.TabPages.Insert (indexLocationYouWant, tabPage);
अमर अशरफ

1
आपके उत्तर @Amr अशरफ के लिए धन्यवाद
User6667769

1

मुझे थोड़ी देर पहले यह संभालना था। मैंने TabPages संग्रह से टैब हटा दिया (मुझे लगता है कि यह है) और शर्तों में बदलाव होने पर इसे वापस जोड़ दिया। लेकिन यह केवल Winforms में था जहाँ मैं टैब को तब तक इधर-उधर रख सकता था जब तक मुझे फिर से इसकी आवश्यकता न हो।


1

आप इसे tabpages: tabPage1.Hide (), tabPage2.Show () आदि के माध्यम से कर सकते हैं।


2
मैं .net कॉम्पैक्ट फ्रेमवर्क 3.5 के साथ विंडोज़ CE 6.0 में इसका इस्तेमाल किया था और यह काम कर रहा था। प्रश्न मंच के बारे में कोई सुराग नहीं देता है। आपको इसकी आवश्यकता कहां है, वेब या डेस्कटॉप या मोबाइल?
एल्डेबरन


0

उपयोगकर्ता को क्लिक करने से रोकने के लिए मैंने अतीत में टैब पृष्ठ हटा दिए हैं। यह शायद सबसे अच्छा समाधान नहीं है, क्योंकि उन्हें यह देखने की आवश्यकता हो सकती है कि टैब पृष्ठ मौजूद है।


0

ईवेंट, और टैब नियंत्रण के गुणों का उपयोग करके आप जब चाहें तब आप को सक्षम / अक्षम कर सकते हैं। मैंने एक बूल का उपयोग किया जो कि 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;
            }
        }
    }

0

मैंने इस समस्या को इस तरह हल किया है: मुझे 3 टैब मिले हैं और मैं उपयोगकर्ता को पहले टैब पर रखना चाहता हूं यदि वह लॉग इन नहीं करता है, तो TabControl के SelectingEvent पर मैंने लिखा था

if (condition) { TabControl.Deselect("2ndPage"); TabControl.Deselect("3dPage"); }

0

उपयोगकर्ता नेविगेट करने के लिए टैब पर क्लिक नहीं कर सकता है, लेकिन वे दो बटन ( 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;
}

0

मान लें कि आपके पास ये नियंत्रण हैं:

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);
            }
        }
    }

यह दूसरा टैब गैर-क्लिक करने योग्य बना देगा।


0

यह एक पुराना सवाल है, लेकिन मेरे अलावा किसी को फायदा हो सकता है। मुझे एक 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();
}

0

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;
    }
}

-1

यदि हम लिखते हैं तो फ़ॉर्म लोड घटना में this.tabpage.PageEnabled = false, टैबपेज अक्षम हो जाएगा।


उस संपत्ति को नहीं देख सकते
जॉन

कृपया जांचें कि क्या आपने इसे फ़ॉर्म के लोड ईवेंट में आज़माया है?
नई

अभी दोगुना चेक किया है। यह नहीं देख सकते हैं।
जॉन

कृपया जाँचें कि क्या आपने इसका उपयोग किया है: निजी शून्य XtraForm1_Load (ऑब्जेक्ट प्रेषक, EventArgs e) {this.xtraTabPage1.PageEnabled = false; } XtraForm1 DevExpress XtraForm है और टैबपेज xtraTabPage DevExpress XtraTabpage है
नई

आपने अपने मूल उत्तर में DevExpress के बारे में कुछ क्यों नहीं कहा ...?
जॉन

-1

उपयोग:

 tabControl1.TabPages[1].Enabled = false;

इस कोड को लिखने से, टैब पेज पूरी तरह से अक्षम नहीं होगा (चयन करने में सक्षम नहीं), लेकिन इसकी आंतरिक सामग्री अक्षम हो जाएगी जो मुझे लगता है कि आपकी आवश्यकताओं को पूरा करेगा।


-1

समाधान बहुत सरल है।

इस लाइन को निकालें / टिप्पणी करें

this.tabControl.Controls.Add(this.YourTabName);

MainForm.cs में IntializeComponent () विधि


-1

मुझे सवाल का उचित जवाब नहीं मिला। विशिष्ट टैब को अक्षम करने का कोई समाधान नहीं दिखता है। मैंने विशिष्ट टैब को एक चर में पारित करने के लिए क्या किया और 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;
}

इसलिए, आप वास्तव में टैब को अक्षम नहीं करते हैं, लेकिन जब दूसरा टैब क्लिक किया जाता है तो यह आपको हमेशा चयनित टैब पर लौटाता है।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.