DataGridview.ContainsFocus возвращает неверно - PullRequest
0 голосов
/ 03 марта 2012

Я использую winform DataGridView для ввода данных. Проблема в том, что когда мой пользователь ввел строку, но не щелкнул по ней, эта строка не сохраняется в источнике данных сетки (данные в памяти). Поэтому, когда мой пользователь отправляет форму, я хочу определить, есть ли у DataGridview фокус, и имитировать нажатие клавиши (вкладка?) Или установить фокус на другой элемент управления или выполнить какую-либо другую операцию, чтобы сохранить текущую строку без изменения данных.

DataGridView.ContainsFocus всегда возвращает false, как и DataGridView.Focused. Есть ли другое свойство, которое я должен использовать? Как мне сохранить этот ряд данных?

РЕДАКТИРОВАТЬ: см. Этот вопрос Проблема с использованием DataGridViewComboboxColumn для ввода для того, как я создаю DataTable и привязываю его к представлению данных. И datagridview не позволяет пользователю удалить строку , чтобы увидеть другую проблему, с которой у меня была эта же таблица данных.

1 Ответ

3 голосов
/ 07 марта 2012

Элементы управления Windows формы могут быть подключены напрямую к источникам данных, но предназначены для использования с BindingSource .Это используется для маршалинга ввода из элементов управления формы в источник данных и из него.

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

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

Источник привязки предоставляет вам более точный контроль над тем, как и когда данныепереносится из элементов управления формы в базовые источники данных.Простое использование Binding Source может решить вашу проблему.Если нет, то вызов метода EndEdit для источника привязки перед попыткой сохранить данные должен привести к тому, что все ожидающие изменения будут записаны в таблицу данных.

В качестве простого примера создайте новый проект форм Windows.К форме добавьте сетевое представление данных с именем «datagridview1», источник BindingSource с именем peopleBinding source и командную кнопку saveButton.Установите источник данных для gridview1 как peopleBindingSource.

Добавьте обработчики событий для form.Load и saveButton.Click следующим образом:

   public DataTable GetData()
    {
        DataTable t = new DataTable();
        t.Columns.Add("FirstName", typeof(string));
        t.Columns.Add("LastName", typeof(string));
        t.Rows.Add("Joe","Bloggs");
        t.Rows.Add("Fred","Bloggs");
        return t;
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        dataGridView1.AutoGenerateColumns = true;
        DataTable people = GetData();
        peopleBindingSource.DataSource = people;

    }

    private void SaveButton_Click(object sender, EventArgs e)
    {
        DataTable t = peopleBindingSource.DataSource as DataTable;
    }

Запустите приложение, и вы должны найти его, если вы проверяететаблица данных в SaveButton_Click, что любые изменения, которые вы внесли в данные, сохраняются.

Если вы предпочитаете, чтобы Visual Studio написал весь код для вас:

  1. Добавьте новый источник данныхс помощью мастера «Добавить источник данных ...».
  2. Из окна «Источники данных» перетащите таблицу на форму.

Visual Studio добавит необходимые DataGridView, BindingSource и т. Д. И свяжет их все для вас.Затем вы можете проверить код, чтобы увидеть, как все это сочетается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...