2012-10-20 14 views
5

के लिए पूर्ववत सुविधा मैं टेक्स्टबॉक्स के लिए एक बहुत ही सरल पूर्ववत सुविधा पर काम कर रहा हूं और मुझे एक अजीब समस्या है। जब मैं Stack से स्ट्रिंग लेने का प्रयास करता हूं जिसमें सभी परिवर्तन होते हैं और उन्हें टेक्स्टबॉक्स में डालते हैं तो मुझे कोई भी परिवर्तन दिखाई नहीं देता है।टेक्स्टबॉक्स

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

क्या टेक्स्टबॉक्स पूर्ववत को रद्द या ओवरराइड करने का कोई तरीका है और अपना स्वयं का फ़ंक्शन उपयोग करें?

private void Form1_KeyDown(object sender, KeyEventArgs e) 
     if (e.KeyCode == Keys.Z && (ModifierKeys & Keys.Control) == Keys.Control) 
      { 
       nameTextBox.Text = undoName.GetLastChange(); //--> not working 

       undoDebuglabel.Text = undoName.GetLastChange(); --> working 
      } 
} 

GetLastChange() एक Stack वर्ग के भीतर से जानकारी हो रही है:

यहाँ परिवर्तन मैंने बनाया से नमूना कोड है।

ऐसा लगता है कि टेक्स्टबॉक्स मुझे परिवर्तन देखने के लिए नहीं दे रहा है। ऐसा इसलिए हो सकता है क्योंकि मैं ऐसा करने के लिए एक ही शॉर्टकट, CTRL + Z का उपयोग कर रहा हूं?

+0

आपके द्वारा पोस्ट किया गया कोड मेरे लिए ठीक काम करता है। –

+0

क्या आप अपने टेक्स्टबॉक्स के अंदर स्टैक से बदलाव देखते हैं? – samy

+0

हां। जाहिर है, मेरे पास पॉपुलर करने के लिए आपके द्वारा सटीक कोड नहीं है, लेकिन अवधारणा वही है। –

उत्तर

4

ClearUndo विधि का उपयोग कर टेक्स्टबॉक्स के अपने ढेर को साफ़ करें। इस प्रयास करें:

nameTextBox.ClearUndo(); 
nameTextBox.Text = undoName.GetLastChange(); 
+0

आह हाँ, क्षमा करें मुझे याद आया। – keyboardP

+0

WinForm विकल्प के साथ अपडेट किया गया। – keyboardP

+0

हाँ यह काम कर रहा था thx! – samy

3

आप System.Windows.Forms.TextBox से इनहेरिट द्वारा इतिहास को संभालने के लिए अपने स्वयं के पाठ बॉक्स बना सकते हैं। मेरी नमूना पर एक नज़र डालें:

public class HistoryTextBox: System.Windows.Forms.TextBox 
{ 
    bool ignoreChange = false; 
    List<string> storage = null; 


    protected override void OnCreateControl() 
    { 
     base.OnCreateControl(); 
     //init storage... 
     storage = new List<string>(); 
    } 

    protected override void OnTextChanged(EventArgs e) 
    { 
     base.OnTextChanged(e); 
     //save change to storage... 
     if (!ignoreChange) 
     { 
      storage.Add(this.Text); 
     } 
    } 

    public void Undo() 
    { 
     if (storage.Count > 0) 
     { 
      this.ignoreChange = true; 
      this.Text = storage[storage.Count - 1]; 
      storage.RemoveAt(storage.Count - 1); 
      this.ignoreChange = false; 
     } 
    } 
} 

हर आप सिर्फ फोन पूर्ववत करने की आवश्यकता:

historyTextBox1.Undo(); 

इस वर्ग आप एक से अधिक histoy रिकॉर्ड दे देंगे।

+0

मुझे अनदेखा करना था परिभाषा में गलत करने के लिए बदलें और स्टोरेज चर के बाद ऑनक्रेट कंट्रोल में इसे सही पर सेट करें। मैं OnTextChanged में स्टोरेज चर पर स्टार्टअप पर एक शून्य प्राप्त कर रहा था। मेरा मानना ​​है कि ऐसा इसलिए था क्योंकि मेरा टेक्स्टबॉक्स डिफ़ॉल्ट टेक्स्ट के साथ शुरू हुआ था और यह ऑनटेक्स्ट चेंगिंग शुरू हो रहा था। –

0

मैंने गेरेगोर और कीबोर्ड के उत्तर पर विस्तार किया। विजुअल स्टूडियो 2017 में पोस्ट किए गए कोड को मैं काम नहीं कर सका, इसलिए मामूली चिमटा बनाया। फिर मैं एक रेडो समारोह भी चाहता था, इसलिए मैंने कोड की कुछ और पंक्तियां जोड़ दीं। ऐसा लगता है कि मेरे परीक्षण में ठीक काम करता है और मैंने सोचा कि मैं साझा करूंगा क्योंकि यह सवाल का जवाब देता है और विस्तार करता है।

यह कोड पूर्ववत, फिर से जोड़ता है, और आप सूची के माध्यम से इसे "रन" करने के लिए Ctrl-Z या Ctrl-Y दबा सकते हैं।

using System; 
using System.Collections.Generic; 
using System.Windows.Forms; 

namespace CodeBuilder 
{ 
    public class HistoryTextBox : System.Windows.Forms.TextBox 
    { 
     bool ignoreChange = true; 
     List<string> storageUndo = null; 
     List<string> storageRedo = null; 


     protected override void OnCreateControl() 
     { 
      base.OnCreateControl(); 
      storageUndo = new List<string>(); 
      storageRedo = new List<string>(); 
      ignoreChange = false; 
     } 

     protected override void OnTextChanged(EventArgs e) 
     { 
      base.OnTextChanged(e); 
      if (!ignoreChange) 
      { 
       this.ClearUndo(); 
       if (storageUndo.Count > 2048) storageUndo.RemoveAt(0); 
       if (storageRedo.Count > 2048) storageRedo.RemoveAt(0); 

       storageUndo.Add(this.Text); 
      } 
     } 

     protected override void OnKeyDown(KeyEventArgs e) 
     { 

      if (e.KeyCode == Keys.Z && (ModifierKeys & Keys.Control) == Keys.Control) 
      { 
       this.ClearUndo(); 
       ignoreChange = true; 
       this.Undo(); 
       ignoreChange = false; 
      } 
      else if (e.KeyCode == Keys.Y && (ModifierKeys & Keys.Control) == Keys.Control) 
      { 
       this.ClearUndo(); 
       ignoreChange = true; 
       this.Redo(); 
       ignoreChange = false; 
      } 
      else 
      { 
       base.OnKeyDown(e); 
      } 
     } 

     public void Redo() 
     { 
      if (storageRedo.Count > 0) 
      { 
       this.ignoreChange = true; 
       this.Text = storageRedo[storageRedo.Count - 1]; 
       storageUndo.Add(this.Text); 
       storageRedo.RemoveAt(storageRedo.Count - 1); 
       this.ignoreChange = false; 
      } 
     } 

     public new void Undo() 
     { 
      if (storageUndo.Count > 0) 
      { 
       this.ignoreChange = true; 
       storageRedo.Add(this.Text); 
       this.Text = storageUndo[storageUndo.Count - 1]; 
       storageUndo.RemoveAt(storageUndo.Count - 1); 
       this.ignoreChange = false; 
      } 
     } 
    } 
} 
संबंधित मुद्दे