2015-03-03 3 views
0

Я пытаюсь поставить 3 переплетены DataGridViewComboBoxCell в моей DataGridView,значение DataGridViewComboBoxCell не является действительным

один за столом «catégorie», второй для таблицы «Статья» и третья для

«ArticleNonCon» Таблица. когда я выбираю catégorie второго

DataGridViewComboBoxCell должен дать мне статьи этой категории и

, когда я выбираю статью третьего DataGridViewComboBoxCell должен дать мне

серийных номеров этой статьи. Это код, я пробовал:

в кнопку мыши, который показывает вид:

if (con.State != ConnectionState.Open) 
{ 
    con.Open(); 
} 

SqlCommand catCmd = new SqlCommand("SELECT IdCategorie, LibCategorieFr FROM Categorie", con); 
DataTable catDt = new DataTable(); 
catDt.Load(catCmd.ExecuteReader()); 
((DataGridViewComboBoxColumn)dataGridView1.Columns["CategorieColumn"]).DataSource = catDt;  
((DataGridViewComboBoxColumn)dataGridView1.Columns["CategorieColumn"]).DisplayMember = "LibCategorieFr"; 
((DataGridViewComboBoxColumn)dataGridView1.Columns["CategorieColumn"]).ValueMember = "IdCategorie"; 

и в CellEndEdit случае DataGridView:

private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e) 
{ 
    switch (dataGridView1.Columns[e.ColumnIndex].Name) 
    { 
     case "CategorieColumn": 
      if (con.State != ConnectionState.Open) 
      { 
       con.Open(); 
      } 
      SqlCommand artCmd = new SqlCommand("SELECT * FROM Article WHERE IdCategorie = @IdCategorie", con); 
      artCmd.Parameters.AddWithValue("@IdCategorie", dataGridView1.CurrentRow.Cells["CategorieColumn"].Value); 
      DataTable articleDt = new DataTable(); 
      articleDt.Load(artCmd.ExecuteReader()); 
      ((DataGridViewComboBoxColumn)dataGridView1.Columns["Column3"]).DataSource = articleDt; 
       ((DataGridViewComboBoxColumn)dataGridView1.Columns["Column3"]).DisplayMember = "LibArticleFr"; 
      ((DataGridViewComboBoxColumn)dataGridView1.Columns["Column3"]).ValueMember = "CodeArticle"; 
      con.Close(); 
      break; 

     case "Column3": 
      if (con.State != ConnectionState.Open) 
      { 
       con.Open(); 
      } 

      SqlCommand numSerieCmd = new SqlCommand("SELECT * FROM ArticleNonCon WHERE CodeArticle = @CodeArticle", con); 
      numSerieCmd.Parameters.AddWithValue("@CodeArticle", dataGridView1.CurrentRow.Cells["Column3"].Value); 
      DataTable numSerieDt = new DataTable(); 
      numSerieDt.Load(numSerieCmd.ExecuteReader()); 
      ((DataGridViewComboBoxColumn)dataGridView1.Columns["NumSerieColumn"]).DataSource = numSerieDt; 
      ((DataGridViewComboBoxColumn)dataGridView1.Columns["NumSerieColumn"]).DisplayMember = "NumSerieArticle"; 
      ((DataGridViewComboBoxColumn)dataGridView1.Columns["NumSerieColumn"]).ValueMember = "id"; 
      con.Close(); 

      break; 
    } 
} 

Этот код работает отлично для первого запуска , но когда я попытаюсь изменить статью и выбрать серийные номера этой статьи из третьего datagridviewComboboxCell, я получил это исключение:

System.ArgumentException: DataGridViewComboBoxCell значение не является допустимым

Это исключение произошло также при попытке закрыть приложение.

Так как исправить эту ошибку или в каком событии datagridview я должен поместить свой код?

Заранее спасибо.

+0

как вы привязываете свои данные к DataGridView? – stefankmitph

+0

Datagridview не привязан, я просто связываю 3 DatagridviewComboboxCell – user4428204

+0

, чего вы пытаетесь достичь? не имеют каких-либо данных (DataSource) в вашем DataGridView? – stefankmitph

ответ

0

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

public class MyDataSource 
{ 
    public int CategoryID { get; set; } 
    public int ArticleID { get; set; } 
    public int ArticleNonCon { get; set; } 
} 

Нам также нужны некоторые классы, которые представляют нашу ComboBox источник данных:

public class Category 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

public class Article 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

public class ArticleNonCon 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

Этот класс (как список его) будет прикреплен к ваш DataGridView и IS ваш DataSource (он будет хранить ValueMembers из ваших ComboBoxes). Поместите следующий код в метод инициализации:

List<MyDataSource> listMyDataSource = new List<MyDataSource>() // it's an empty list of MyDataSource 

dataGridView1.AutoGenerateColumns = false; // prevent DataGridView from adding columns we don't want to have 

dataGridView1.DataSource = new BindingList(listMyDataSource); // this is very important as we want to add new rows to our DataGridView. Adding just a list object wouldn't allow this 

Теперь мы должны создать источники данных для наших ComboBoxColumns:

List<Category> listCategories = new List<Category> 
{ 
    new Category { ID = 1, Name = "Category1"}, 
    new Category { ID = 2, Name = "Category2"}, 
    new Category { ID = 3, Name = "Category3"}, 
}; 

List<Article> listArticles = new List<Article> 
{ 
    new Article { ID = 1, Name = "Article1"}, 
    new Article { ID = 2, Name = "Article2"}, 
    new Article { ID = 3, Name = "Article3"}, 
}; 

List<ArticleNonCon> listArticlesNonCon = new List<ArticleNonCon> 
{ 
    new ArticleNonCon{ ID = 1, Name = "ArticleNonCon"}, 
    new ArticleNonCon{ ID = 2, Name = "ArticleNonCon"}, 
    new ArticleNonCon{ ID = 3, Name = "ArticleNonCon"}, 
}; 

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

Теперь мы добавим столбцы в DataGridView:

dataGridView.Columns.Add(new DataGridViewComboBoxColumn 
{ 
    Name = "CategoryColumn", 
    DataSource = listCategories, 
    ValueMember = "ID", // property of our class Category 
    DisplayMember = "Name", // property of our class Category 
    DataPropertyName = "CategoryID" // bind it to the property CategoryID from our class MyDataSource 
}); 
... 

То же самое касается и статьи ArticleNonCon.

Одна вещь, которую вам нужно будет сделать: Подпишитесь на событие DataError вашего DataGridView (иначе вы получите исключение при попытке добавить новую строку с пустыми данными).

dataGridView.Columns.Add(new DataGridViewComboBoxColumn 
{ 
    Name = "ArticleColumn", 
    DataSource = listArticles, 
    ValueMember = "ID", 
    DisplayMember = "Name", 
    DataPropertyName = "ArticleID" 
}); 

Это должно быть сделано. (и это способ привязки и отображения данных в Winforms)

+0

Большое спасибо, я попробую ваш код – user4428204

+0

получил какой-либо прогресс? – stefankmitph

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