Как привязать значения из datagridview к списку элементов в C#?
Я делаю ранцевое приложение на языке C#.
У меня есть файл excel, где у меня есть список продуктов, Цена, количество и из которого я заполняю свой datagridview1. Когда он заполняется, у меня есть текстовое поле, где я выбираю любую сумму, а затем в соответствии с этой суммой datagridview2 заполняется продуктами, где общая сумма равна сумме, которую я ввел.
Проблема в том, что я получаю эту ошибку, когда хочу, чтобы мой datagridview2 был заполнен:
Невозможно привести объект типа 'System.DBNull' к другим типам....
Вот мой код:
public partial class Form1 : Form { public Form1() { InitializeComponent(); configureDataGridViewColumns(); } public bool IsReusable { get { return true; } } public void ProcessRequest(DataGridView context) { List<Item> items = new List<Item>(); foreach (DataGridViewRow dr in dataGridView2.Rows) { //I've assumed imaginary properties ColName and ColValue in MyItem class items.Add(new Item(Convert.ToString(dr.Cells[1].Value), Convert.ToInt32(dr.Cells[3].Value), Convert.ToInt32(dr.Cells[2].Value), Convert.ToDouble(dr.Cells[0].Value))); } int capacity = Convert.ToInt32(montant.Text); ItemCollection[] ic = new ItemCollection[capacity + 1]; for (int i = 0; i <= capacity; i++) ic[i] = new ItemCollection(); for (int i = 0; i < items.Count; i++) for (int j = capacity; j >= 0; j--) if (j >= items[i].Weight) { double quantity = Math.Min(items[i].Quantity, j / items[i].Weight); for (int k = 1; k <= quantity; k++) { ItemCollection lighterCollection = ic[j - k * items[i].Weight]; int testValue = lighterCollection.TotalValue + k * items[i].Value; if (testValue > ic[j].TotalValue) (ic[j] = lighterCollection.Copy()).AddItem(items[i], k); } } foreach (KeyValuePair<string, int> kvp in ic[capacity].Contents) { string[] row = new string[] {kvp.Key, kvp.Value.ToString()}; context.Rows.Add(row); } } private void configureDataGridViewColumns() { DataGridViewColumnCollection columns = dataGridView1.Columns; DataGridViewTextBoxColumn textColumn = new DataGridViewTextBoxColumn(); textColumn.DataPropertyName = "Designation"; textColumn.Name = "Designation"; textColumn.HeaderText = "Designation"; textColumn.ValueType = typeof(char); textColumn.Width = 180; columns.Add(textColumn); textColumn = new DataGridViewTextBoxColumn(); textColumn.DataPropertyName = "Quantite"; textColumn.Name = "Quantite"; textColumn.HeaderText = "Quantite"; textColumn.ValueType = typeof(decimal); textColumn.ReadOnly = true; textColumn.DefaultCellStyle.Format = "N2"; textColumn.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight; columns.Add(textColumn); textColumn = new DataGridViewTextBoxColumn(); textColumn.DataPropertyName = "Prix Unitaire"; textColumn.Name = "Prix Unitaire"; textColumn.HeaderText = "Prix Unitaire (CFA.)"; textColumn.ValueType = typeof(decimal); textColumn.ReadOnly = true; textColumn.DefaultCellStyle.Format = "N2"; textColumn.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight; columns.Add(textColumn); textColumn = new DataGridViewTextBoxColumn(); textColumn.DataPropertyName = "Montant"; textColumn.Name = "Montant"; textColumn.HeaderText = "Montant (CFA.)"; textColumn.ValueType = typeof(decimal); textColumn.ReadOnly = true; textColumn.DefaultCellStyle.Format = "N2"; textColumn.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight; columns.Add(textColumn); Padding padding = dataGridView1.DefaultCellStyle.Padding; padding.Right = 10; dataGridView1.DefaultCellStyle.Padding = padding; } private class Item { public string Description; public int Weight; public int Value; public double Quantity; public Item(string description, int weight, int value, double quantity) { Description = description; Weight = weight; Value = value; Quantity = quantity; } } private class ItemCollection { public Dictionary<string, int> Contents = new Dictionary<string, int>(); public int TotalValue; public int TotalWeight; public void AddItem(Item item, int quantity) { var a = ";"; if (Contents.ContainsKey(item.Description)) { Contents[item.Description] += quantity; Contents[item.Description] += item.Weight; } else { Contents[item.Description] = item.Weight; } Contents[item.Description] = Convert.ToInt32(string.Format("{0:D2}{1}", item.Weight, quantity)); TotalValue += quantity * item.Value; TotalWeight += quantity * item.Weight; } public ItemCollection Copy() { var ic = new ItemCollection(); ic.Contents = new Dictionary<string, int>(this.Contents); ic.TotalValue = this.TotalValue; ic.TotalWeight = this.TotalWeight; return ic; } } private void button1_Click(object sender, EventArgs e) { ProcessRequest(dataGridView1); } private void button2_Click(object sender, EventArgs e) { openFileDialog1.ShowDialog(); string nomFichier = openFileDialog1.FileName; //string nomFichier = My.Computer.FileSystem.CurrentDirectory + "\\ex47.xlsx"; DataSet dat = new DataSet(); //déclaration et utilisation d'un OLeDBConnection using (OleDbConnection Conn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;" + " Data Source='" + nomFichier + "';" + " Extended Properties=\"Excel 8.0;;HDR=YES\"")) { Conn.Open(); //déclaration du DataAdapter //notre requête sélectionne toute les cellule de la Feuil1 using (OleDbDataAdapter Adap = new OleDbDataAdapter( "select * from [Feuil1$]", Conn)) { Adap.TableMappings.Add("Table", "TestTable"); //Chargement du Dataset Adap.Fill(dat); //On charge les données sur le DGV dataGridView2.DataSource = dat.Tables[0]; } //libèrer les ressources Conn.Close(); } } }
Что я уже пробовал:
So what do you think ? What's wrong ?
F-ES Sitecore
Всякий раз, когда вы получаете сообщение об ошибке, всегда говорите, на какой строке происходит ошибка.