Как бы вы запретили пользователю добавлять / удалять строки в TextBox? - PullRequest
0 голосов
/ 02 марта 2009

Как бы вы запретили пользователю добавлять или удалять строки в TextBox? Под этим я подразумеваю, если я установлю текст в текстовом поле на 7 строк с некоторым текстом, как я могу быть уверен, что там всегда будет 7 строк текста? Пользователь должен иметь возможность редактировать эти строки, как обычно, но не удалять строку целиком и не добавлять новые.

Нужно учитывать как ввод с клавиатуры, так и такие вещи, как вырезание и вставка и т. Д.

Есть хорошие идеи?


Причина: Я хочу сделать переименователь файла вроде Переименователь Оскара . Вы даете ему папку, и она загружает имена файлов в текстовое поле, где вы можете вносить изменения почти так же, как вы делаете это в текстовом редакторе. Когда вы довольны своими изменениями, вы записываете их обратно. Причина для постоянных n строк в текстовом поле, разумеется, заключается в том, что строка n является именем файла n. Добавление новой строки не должно быть разрешено, поскольку у вас есть только эти файлы в этой папке. Удаление строки также не должно быть разрешено, поскольку в этом случае вам будет не хватать имени для файла.

Зачем пытаться создать что-то подобное, если оно уже существует? Ну, мне любопытно посмотреть, смогу ли я это сделать, и подумал, что это может быть хорошим упражнением, чтобы узнать несколько вещей по пути. Поскольку у него есть некоторые интересные проблемы, которые необходимо решить. Как этот :) Есть также некоторые функции, которые, я думаю, отсутствуют в этом Renamer Оскара . Итак ... Подводя итог: я делаю это, чтобы узнать и попытаться сделать еще лучшую версию этого. Я прекрасно знаю, что с тем же успехом могу полностью потерпеть неудачу или просто никогда не закончить: p Но это другая история. Я хочу выучить

Ответы [ 6 ]

6 голосов
/ 02 марта 2009

У вас неправильный интерфейс для данных. В этом случае у вас должно быть фиксированное количество текстовых полей, по одному на каждую строку данных. Это позволило бы пользователю изменять содержимое каждой строки, но не удалять строку или добавлять строку.

Попытка заставить многострочное текстовое поле сделать это будет в лучшем случае безумной, так как вам придется определить, когда новая строка добавлена ​​/ удалена, а затем убить изменение.

3 голосов
/ 02 марта 2009

Почему бы не использовать список вместо этого?

2 голосов
/ 02 марта 2009

Я бы, вероятно, позволил пользователю делать то, что он хочет, в текстовом поле, а затем добавил бы проверку, чтобы показать пользователю, что есть ошибка, когда он превышает 7 строк (например, красный контур и всплывающая подсказка или что-то в этом роде). Если они не превышают 7 строк, без проблем добавьте их, когда приступите к обработке этих данных.

Какова конкретная причина, по которой вы хотите всегда 7 строк? Как сказал casperOne, возможно, интерфейс, который вы используете, не идеален для ваших нужд.

1 голос
/ 02 марта 2009

Поскольку вы уже заявили, что это учебный проект, посмотрите, смогу ли я это сделать, я думаю, вам следует добавить в него немного WPF. Список со списком элементов решит эту проблему очень хорошо.

Если это не так, я бы хотел использовать сетку данных вместо текстового поля.

1 голос
/ 02 марта 2009

Одним из возможных способов сделать это является создание подкласса элемента управления Textbox и переопределение метода winProc. Этот метод обрабатывает все сообщения окна, переданные в оконный элемент управления (текстовое поле в вашем случае). Вы можете отслеживать использование возврата и удалять ключи и положение в каратах и ​​отбрасывать нажатия клавиш, которые пытаются удалить последовательности перевода строки возврата каретки. И предоставьте пользователю интерактивное оповещение, в котором говорится, почему он не может удалить целые строки.

Делая это таким образом, вы получаете полный контроль и самый низкоуровневый способ просмотра всех входных данных, поступающих в ваш элемент управления Textbox. Вы можете перехватывать определенные сообщения и отбрасывать их, те, которые вы хотите разрешить, просто передавайте их в метод базового класса. Например, пользователь выделяет все строки и нажимает клавишу удаления. Существуют и другие обработчики событий, которые вы можете использовать для перехвата ввода с клавиатуры, но у них есть некоторые ограничения: winProc позволит вам проверить любое сообщение, направленное на элемент управления, включая удаление, копирование и вставку возврата на задний план и т. Д., Щелчки мыши и т. Д.

Пример:

public class myCustomTextBox : TextBox
{
    protected override void WndProc(ref Message m)
    {
        if (m.Msg == 770) // window paste message id
        {
            string clipBoardData = Clipboard.GetDataObject().GetData(DataFormats.Text).ToString();
            handlePasteEvent(clipBoardData);
        }
        else
        {
            base.WndProc(ref m);
        }
    }
    private void handlePasteEvent(string pasteData)
    {
        // process pasted data
    }
}
0 голосов
/ 02 марта 2009

Загрузите ваши данные в редактируемый DataGrid вместо TextBox, что должно упростить задачу, а также вы можете выбрать, какие столбцы редактируемые, а какие нет.

Вот пример, который использует DataGridView и имитирует ваше текстовое поле:

  • Линии сетки скрыты.
  • Заголовки столбцов и строк скрыты.
  • Цвет фона такой же, как у TexBox.

Добавьте DataGridView в форму и используйте следующий код:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace Test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.dataGridView1.AllowUserToResizeRows = false;
            this.dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
            this.dataGridView1.BackgroundColor = SystemColors.Window;
            this.dataGridView1.BorderStyle = BorderStyle.None;
            this.dataGridView1.CellBorderStyle = DataGridViewCellBorderStyle.None;
            this.dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
            this.dataGridView1.ColumnHeadersVisible = false;
            this.dataGridView1.EditMode = DataGridViewEditMode.EditProgrammatically;
            this.dataGridView1.MultiSelect = false;
            this.dataGridView1.RowHeadersVisible = false;
            this.dataGridView1.SelectionChanged += new System.EventHandler(this.dataGridView1_SelectionChanged);

            dataGridView1.DataSource = Directory.GetFiles(Environment.CurrentDirectory).Select(f => new FileEdit { FileName = Path.GetFileName(f) }).ToList();
        }

        private void dataGridView1_SelectionChanged(object sender, EventArgs e)
        {
            dataGridView1.BeginEdit(true);
        }

    }

    class FileEdit
    {
        public string FileName { get; set; }    
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...