Проблема в 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>
, Это должно работать, однако:)