2012-10-20 37 views
5

Tôi đang làm việc trên một tính năng Hoàn tác rất đơn giản cho một Hộp văn bản và tôi gặp vấn đề lạ. Khi tôi cố gắng lấy chuỗi từ Stack giữ tất cả các thay đổi và đặt chúng bên trong Hộp văn bản, tôi không thấy bất kỳ thay đổi nào.Tính năng hoàn tác cho Hộp văn bản

Tôi đã tạo một Nhãn gỡ lỗi nhỏ để kiểm tra xem điều này có thực sự hoạt động hay không. Tôi phát hiện ra rằng nó đang làm việc trong nhãn, nhưng trong Textbox nó sử dụng chức năng Undo của riêng nó.

Có cách nào để hủy hoặc ghi đè Hoàn tác hộp văn bản và sử dụng chức năng của riêng tôi không?

Đây là mẫu mã từ sự thay đổi tôi đã thực hiện:

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

Các GetLastChange() là nhận được thông tin từ một Stack bên trong lớp.

Giống như hộp văn bản không cho phép tôi xem các thay đổi. Có thể vì tôi đang sử dụng cùng một lối tắt, CTRL + Z để làm điều đó?

+0

Mã bạn đăng hoạt động tốt cho tôi. –

+0

Bạn có thấy các thay đổi từ ngăn xếp bên trong hộp văn bản của mình không? – samy

+0

Có. Rõ ràng là tôi không có mã chính xác mà bạn làm để điền vào nó, nhưng khái niệm thì giống nhau. –

Trả lời

4

Xóa ngăn xếp của hộp văn bản bằng cách sử dụng phương thức ClearUndo. Hãy thử điều này:

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

Ah vâng, xin lỗi tôi đã bỏ lỡ điều đó. – keyboardP

+0

Cập nhật với WinForm thay thế. – keyboardP

+0

có thx làm việc của nó! – samy

3

Bạn có thể tạo TextBox của riêng mình để xử lý lịch sử bằng cách kế thừa từ System.Windows.Forms.TextBox. Hãy xem mẫu của tôi:

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

Mỗi lần bạn cần phải lùi lại chỉ cần gọi:

historyTextBox1.Undo(); 

Lớp này sẽ cung cấp cho bạn nhiều kỷ lục histoy.

+0

Tôi phải đặt ignoreChange thành false trong Định nghĩa và đặt thành true trong OnCreateControl sau biến lưu trữ. Tôi đã nhận được một null khi khởi động trên biến lưu trữ trong OnTextChanged. Tôi tin rằng điều này là do TextBox của tôi bắt đầu với văn bản mặc định và nó đã kích hoạt OnTextChanged sớm. –

0

Tôi đã mở rộng trên số điện thoại GeregorBàn phím. Tôi không thể nhận được mã để làm việc như được đăng trong Visual Studio 2017, do đó, thực hiện một tinh chỉnh nhỏ. Sau đó, tôi muốn có một chức năng Redo là tốt, vì vậy tôi đã thêm một vài dòng mã. Điều này dường như làm việc tốt trong thử nghiệm của tôi và tôi nghĩ rằng tôi sẽ chia sẻ vì nó trả lời câu hỏi và mở rộng.

Mã này thêm hoàn tác, làm lại và bạn có thể giữ phím Ctrl-Z hoặc Ctrl-Y để nó chạy "" qua danh sách.

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; 
      } 
     } 
    } 
} 
Các vấn đề liên quan