Squeak.ru - шаблоны программирования

Событие Keydown проглатывается/не обрабатывается в элементе управления DataGridView

У меня проблема с некоторым кодом, который я разработал на основе статьи Событие нажатия клавиши DataGridView не работает в С#.

Я хотел разрешить пользователю добавлять строку в элемент управления Dataviewgrid, но обнаружил, что включение AllowUserToAddRows приводит к отображению дополнительной строки, как только первый символ вводится в новую ячейку в новой строке. Это могло бы сбить с толку моего бедного пользователя, поэтому, чтобы предотвратить это, я использовал код из статьи выше, чтобы немедленно отключить AllowUserToAddRows при каждом нажатии клавиши (хотя предпочел бы делать это только после ввода первого символа). Однако это, кажется, проглатывает 1-й введенный символ, т.е. он не передается базовому классу для обработки. Вот полный код:

public sealed class XDataGridView : DataGridView
{
    private bool _singleUpdateOnly = true;

    public bool SingleUpdateOnly
    {
        get { return _singleUpdateOnly; }
        set { _singleUpdateOnly = value; }
    }

    [Description("Disallows user adding rows as soon as a key is struck to ensure no blank row at bottom of grid")]
    protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)
    {
        if (SingleUpdateOnly)
        {
            AllowUserToAddRows = false;
        }

        return base.ProcessCmdKey(ref msg, keyData);
    }
}

Почему 1-й символ, который я набираю, проглатывается? Как я могу предотвратить это? Есть ли лучший способ, чем то, что я закодировал?

12.12.2012

  • Предложение: вы можете AllowUserToAddRows = false и добавить несколько Button, скажем, addButton и в случае нажатия кнопки, dataGridView1.Rows.Add(); и отключить addButton, пока пользователь изменяет и еще не сделал с одной строкой, и снова включить. 13.12.2012
  • @spajce Спасибо, я пробовал, но это невозможно в сетке с привязкой к данным. 13.12.2012

Ответы:


1

У меня было очень мало ответов на этот вопрос на этом форуме и других. Должно быть, это очень сложная проблема, или я просто слишком многого жду от элемента управления DataGridView. После многих часов проб и ошибок я остановился на решении, которое не требует создания подклассов. Решение не совсем то, что я хотел, то есть предотвратить добавление еще одной строки в нижнюю часть сетки, как только пользователь начнет вводить новую добавленную строку, но оно приближается. Я использую событие CellLeave, чтобы отключить AllowUserToAddRows. Когда пользователь нажимает Tab или Enter, чтобы ввести данные в 1-ю ячейку, это эффективно удаляет вновь добавленную строку из сетки, оставляя пользователя в следующей ячейке вновь добавленной (последней) строки сетки (без пустой строки под ней). ). Не элегантно, но, по крайней мере, в основном функционально. Вот код:

private void uxContactEmailAddressesGrd_CellLeave(object sender, DataGridViewCellEventArgs e)
{
    uxContactEmailAddressesGrd.AllowUserToAddRows = false;
}

Может быть, когда-нибудь кто-то еще столкнется с этой проблемой и найдет решение более элегантное, чем мое. Это было бы здорово. Убедитесь, что вы разместили свое решение на этом сайте, чтобы другие могли его использовать.

18.12.2012
Новые материалы

Угловая структура архитектуры
Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

«Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

Создайте API с помощью Python FastAPI
Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

Веселье с прокси-сервером JavaScript
Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...