Проблема в DataGridView: пользователю кажется, что datagridview доступен только для чтения (WinForms)

У меня есть датагридвью в моей форме. Он заполняется, выбирая страну с городами страны. Я установил свойство (AllowUsersToAddRow = True), но когда я запускаю свой проект, пользователь не может добавлять, редактировать или удалять строки. Я проверял это. Он не только для чтения (readonly = false) и это включено (Enabled = true)

В чем проблема?

Код заполнения таблицы данных:

private void cmbCountryValues_SelectedIndexChanged(object sender, EventArgs e)
{
    dgvCityValues.Enabled = cmbCountryValues.SelectedIndex>=0;
    if (!dgvCityValues.Enabled)
    {
        dgvCityValues.DataSource = null;
        return;
    }

    int CountryId = int.Parse(cmbCountryValues.SelectedValue.ToString());

    dgvValues.DataSource = from record in Program.dal.Cities(CountryId) select new { record.City};
 }

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

1 ответ

Решение

Чтобы привести упрощенный пример, если я сделаю эквивалент вашего запроса, например:

var cities = new City[] { new City("New York","NY"), new City("Sydney","SY"), new City("London","LN") };
dataGridView.DataSource = cities;

Я получаю тот же результат, что и вы - нет возможности добавлять новые строки, но если я изменю на BindingList<T> и установите это AllowNew все работает

var cities = new City[] { new City("New York","NY"), new City("Sydney","SY"), new City("London","LN") };
var citiesBinding = new BindingList<City>(cities);
citiesBinding.AllowNew = true;

dataGridView.DataSource = citiesBinding;

РЕДАКТИРОВАТЬ - с решением для вашего конкретного примера:

private class City
{
    public string Name { get; set; }
}

private void cmbCountryValues_SelectedIndexChanged(object sender, EventArgs e)
{
    dgvCityValues.Enabled = cmbCountryValues.SelectedIndex >= 0;
    if (!dgvCityValues.Enabled)
    {
        dgvCityValues.DataSource = null;
        return;
    }

    int CountryId = int.Parse(cmbCountryValues.SelectedValue.ToString());

    var queryResults = from record in Program.dal.Cities(CountryId) select new City { Name = record.City };
    var queryBinding = new BindingList<City>(queryResults.ToList());
    queryBinding.AllowNew = true;

    dgvValues.DataSource = queryBinding;
}

Обратите внимание, что а) мне пришлось изменить анонимный тип в запросе выберите конкретный тип City а также изменить IEnumerable<T> возвращается запросом Linq к IList<T> совместимый тип для создания BindingList<T>, Это должно работать, однако:)

Другие вопросы по тегам