2013-12-14 43 views
4

Я создаю приложение, которое использует DataGridView для создания и изменения локального списка, который позже будет импортирован в систему. Он должен быть доступен для редактирования пользователем (щелчок и запись в DGV), и он также должен поддерживать импорт из csv, что означает, что мне нужна двухсторонняя синхронизация между DGV и datasource.DataGridView отсутствует новая строка с пустым источником данных

Я установил DataSource в DGV, чтобы в BindingList<Client>, как это:

//In my seperate Client class-file 
public class Client 
{ 
    private string _name; 
    private string _mac; 
    private string _status; 

    public Client(string pcnavn, string MAC) 
    { 
     _pcnavn = pcnavn; 
     _mac = mac; 
    } 

    public string Name 
    { 
     get 
     { 
      return _name; 
     } 
     set 
     { 
      _name = value; 
     } 
    } 

    public string MAC 
    { 
     get 
     { 
      return _mac; 
     } 
     set 
     { 
      _mac = value; 
     } 
    } 

    public string Status 
    { 
     get 
     { 
      return _status; 
     } 
     set 
     { 
      _status = value; 
     } 
    } 
} 

//In my mainform class 

public BindingList<Client> clientDataSource = new BindingList<Client>(); 

public MainForm() 
{ 
InitializeComponent(); 
//clienDataGridView.AutoGenerateColumns = false; //The duplicate columns where fixed by setting DataPropertyName for all columns. 
clientDataGridView.DataSource = clientDataSource; 
} 

При таком подходе DGV генерируется, но он пуст (только заголовки), так что пользователь не может добавить с помощью DGV. Без DataSource он отображает пустую строку, такую ​​как редактор SQL, поэтому я могу создавать строки вручную в DGV. Как я могу показать «новый элемент», когда он связан с пустым источником данных? Все примеры, которые я нашел, используют непустые источники данных.

AllowUserToAddRows и AllowUserToDeleteRows установлены на true.

Эта фотография показывает мою проблему. «Первая строка» отсутствует при использовании источника данных. Невозможно добавить данные, набрав DGV. DGV

ответ

9

При взгляде на MSDN, я нашел это:

Если DataGridView привязан к данным, пользователь может добавлять строки если для этого свойства и источника данных свойство IBindingList.AllowNew установлено равным true.

кажется BindingList обладает этим свойством, как false по умолчанию, так что этот маленький трюк зафиксировал его:

public BindingList<Client> clientDataSource = new BindingList<Client>() { AllowNew = true }; 
+0

Рад, что вы нашли решение. – Kurubaran

+0

Спасибо, я установил свойство AllowNew объекта bindingsource в конструкторе, но все еще не работал. До тех пор, пока я не использовал свойство Datasource для bindingSource, а не тот, который из самого datagridview привязал данные. Это сработало. – Peter

2

Я думаю, вам не хватает настройки DataPropertyName.

  1. Сначала вы должны добавить столбцы в свою сетку данных. Перейдите к опции добавления столбцов и добавьте необходимые столбцы с помощью мастера.

  2. Во-вторых, вы должны отредактировать каждый столбец в режиме мастера и установить DataPropertyName. В основном для каждого созданного столбца сетки вам необходимо указать точное имя связанного свойства класса Client.

enter image description here


Displaying Empty Row

При связывании пустого списка в строку DGV по умолчанию будет удален. Если вам нужно вывести пустую строку, то сделать так,

//Adding a client object to the collection so that an empty row will be inserted to DGV 
clientDataSource.Add(new Client()); 
clientDataGridView.DataSource = clientDataSource; 
+0

Я действительно пропустил это на одной из колонн, но у меня было это на остальном. Так что теперь я не получаю дубликаты столбцов, когда я удаляю 'AutoGenerateColumns', но я все еще не получаю первую пустую строку при указании источника данных. Я обновлю вопрос с фотографиями проблемы :) –

+0

@Graimer Проверьте мой обновленный ответ. – Kurubaran

+0

Ты, сэр, гений! Одна крошечная «проблема». Когда я это сделал, я получаю пустую строку PLUS «новая строка» (со звездой), как верх моего изображения. В идеальном мире я ТОЛЬКО хочу этого. Поскольку, если я использую ваше решение, мне нужно будет создать пользовательскую логику, чтобы люди не нажимали кнопку RUN, когда у них только пустой объект, который я создал. Я знаю, что я не так хорошо объясняю, но вы следуете? :-) Какие-либо предложения? –

0

См конфигурации здесь See config here

try 
{ 

    int id =Convert.ToInt32(textBox1.Text); 
    string query = "SELECT * FROM ngo.inser WHERE ID LIKE '%" + id + "%'"; 
    command = new MySqlCommand(query, connection); 
    adapter = new MySqlDataAdapter(command); 
    table = new DataTable(); 
    adapter.Fill(table); 

    dataGridView1.DataSource = table; 
} 
catch(Exception ex) 
{ 
    MessageBox.Show(ex.Message); 
} 

И перейти к колонке DataGridView редактирования установка. В этом меню DATA с именем DataPropertyName можно изменить не-свойство в фактическое имя столбца базы данных.Затем он покажет вам эту информацию о столбцах. Если у вас есть несколько столбцов, установите всю эту информацию.

Смежные вопросы