在我的表单中,我有一个从sqllite数据库填充的DataGridView(grid1)。
我想选择名称为" cap"的列。并将列的值插入数组中。 我该怎么办?
我尝试这样做(来自网站上的旧答案),但它给了我错误的#34;超出有界矩阵"
int[] wareCap = new int[grid1.Rows.Count];
...
//How I filled my dgv, if this can help
var context = new ForliCesenaEntities2();
BindingSource bi1 = new BindingSource();
bi1.DataSource = context.warehouses.ToList();
grid1.DataSource = bi1;
grid1.Refresh();
//How I try to insert the values into int[] wareCap
for (int i = 0; i<(grid1.Rows.Count-1); i++)
wareCap[i] = Convert.ToInt16(grid1.Rows[i].Cells[1].Value);
感谢您的建议
答案 0 :(得分:2)
首先,您必须使用值填充gridview,然后:
List<int> intValues = new List<int>();
foreach (DataGridViewRow row in grid.Rows)
{
intValues.Add(int.Parse(row.Cells["cap"].Value.ToString()));
}
int[] array = intValues.ToArray();
应该这样做。
或者,您可以使用LINQ。
int[] intArray = dataGridView1.Rows
.Cast<DataGridViewRow>()
.Select(row => int.Parse(row.Cells["cap"].Value.ToString())).ToArray();
更新:
如果DataGridView的AllowUserToAddRows属性设置为true,则上述解决方案可能会崩溃。因为在这种情况下,您的最后一行是用于输入新记录的行,Value为null,因此在其上调用ToString方法会导致NullReferenceException。
我看到两种可能性:
检查该行是否是输入新记录的行:
int[] intArray = dataGridView1.Rows
.Cast<DataGridViewRow>()
.Where(row => !row.IsNewRow)
.Select(row => Convert.ToInt32(row.Cells["cap"].Value.ToString())).ToArray();
答案 1 :(得分:0)
你已经在List中获得了所有的值,因为你做了某事。像这样:
bi1.DataSource = context.warehouses.ToList();
您可以轻松地将其存储在参考文献中:
var values = context.warehouses.ToList();
bi1.DataSource = values;
您的网格是基于此列表中的Objekts构建的。所以这应该构建你的数组:
int[] array = new int[values.Count];
int counter = 0;
foreach (var object in values)
{
array[counter++] = object.CAP;
}
答案 2 :(得分:0)
int[] wareCap = new int[grid1.Rows.Count];
foreach(DataGridViewRow row in grid1.Rows)
{
wareCap.Add(Convert.ToInt32(cell["cap"].Value.ToString()));
}