Bạn đã bao giờ tưởng tượng cuộc sống của chúng ta mà không cần bộ nhớ tạm ("Cut-Copy-Paste") trong thời đại máy tính ngày nay? Sử dụng clipboard là rất phổ biến và rất thường xuyên, nhưng ở đây tôi thảo luận về cách code chúng(trên một điều khiển ListBox) thay vì chỉ sử dụng chúng.
Trong bài viết này, tôi sẽ chỉ cho một số cách thức chỉnh sửa, như: Select All, Clear All, Cut, Copy và Paste trên điều khiển ListBox. Để chứng minh điều này, tôi đã tạo ra một ứng dụng Win Form đơn giản với điều khiển Menu và ListBox . Trên Menu Strip, tất cả các hoạt động được nhập vào như các mục menu với phím tắt.
Để hiểu rõ hơn, code mẫu được đính kèm với bài viết này. Đây là ảnh chụp màn hình của giao diện:
Select All
Để select All các mục trong ListBox, trước tiên chúng ta xóa tất cả các mặt hàng được lựa chọn sau đó chọn từng mục trong khi lặp lại thông qua toàn bộ danh sách.
private void selectAllToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
listBox1.SelectedItems.Clear();
for (int i = 0; i < listBox1.Items.Count; i++)
{
listBox1.SetSelected(i, true);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
Paste
Để dán dữ liệu vào văn bản ListBox, trước tiên chúng ta lấy dữ liệu văn bản từ bộ đệm bằng cách sử dụng lớp Clipboard. Vì nó là ListBox nơi mỗi mục trong ListBox phải tương ứng với mỗi dòng trong bộ đệm, ở đây tôi phân tích các dữ liệu văn bản bằng một ký tự dòng mới và sau đó lưu trữ mỗi dòng là một mục mới trong ListBox.
private void pasteToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
// Getting Text from Clip board
string s = Clipboard.GetText();
//Parsing criteria: New Line
string[] lines = s.Split('\n');
foreach (string ln in lines)
{
listBox1.Items.Add(ln.Trim());
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
Copy
Để sao chép các dữ liệu văn bản vào bộ đệm, chúng ta lặp lại toàn bộ bộ sưu tập sản phẩm được chọn và tiếp tục thêm các mục vào đối tượng StringBuilder. Để giữ cho tất cả các mục trong hàng mới, tôi đang sử dụng ở đây phương thức AppendLine() sau khi chèn văn bản của mục vào StringBuilder. Cuối cùng tôi sử dụng Clipboard.SetData() để sao chép dữ liệu vào bộ đệm.
private void copyToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
StringBuilder sb = new StringBuilder();
foreach (object row in listBox1.SelectedItems)
{
sb.Append(row.ToString());
sb.AppendLine();
}
sb.Remove(sb.Length - 1, 1); // Chỉ cần để tránh sao chép cuối trống hàng
Clipboard.SetData(System.Windows.Forms.DataFormats.Text, sb.ToString());
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
Cut
Về cơ bản hoạt động cắt là sự kết hợp của việc sao chép và gỡ bỏ các mục được lựa chọn. Để làm điều này, tôi bắt đầu sao chép tất cả các mục đã chọn (như trên) vào bộ đệm. Sau khi sao chép, tôi loại bỏ tất cả các mục được lựa chọn từ ListBox. Chúng ta cần bộ sưu tập để giữ cho tất cả các mục đã chọn. Tôi đang tạo ra bộ sưu tập riêng biệt này bởi vì tôi không thể xóa các mục từ bộ sưu tập trong khi lặp lại các bộ sưu tập tương tự sử dụng một vòng lặp foreach.
private void cutToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
StringBuilder sb = new StringBuilder();
// we use this collection to keep all the Selected Items
List<object> selectedItemList = new List<object>();
foreach (object row in listBox1.SelectedItems)
{
sb.Append(row.ToString());
sb.AppendLine();
// Keep on adding selected item into a new List of Object
selectedItemList.Add(row);
}
sb.Remove(sb.Length - 1, 1); // Just to avoid copying last empty row
Clipboard.SetData(System.Windows.Forms.DataFormats.Text, sb.ToString());
// Removing selected items from the ListBox
foreach (object ln in selectedItemList)
{
listBox1.Items.Remove(ln);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
Clear All
Đây là vận hành đơn giản nhất. Chúng ta cần phải chỉ rõ ràng tất cả các mục từ ListBox sử dụng được xây dựng trong phương thức Clear().
private void clearAllToolStripMenuItem_Click(object sender, EventArgs e)
{
listBox1.Items.Clear();
}