gpt4 book ai didi

c# - 将数组的所有元素添加到 datagridview 行,除了一个

转载 作者:太空狗 更新时间:2023-10-29 21:34:51 24 4
gpt4 key购买 nike

我正在逐行读取一个文本文件,并将其插入到一个数组中。

然后我有这个名为 custIndex 的列表,它包含某些索引,我正在测试的项目数组的索引,以查看它们是否是有效代码。 (例如,custIndex[0]=7,所以我在我这里的两个词典中检查 items[7-1] 中的值以查看其是否有效)。然后,如果有无效代码,我将行(项目数组)添加到 dataGridView1。

事实是,dataGridView1 中的某些列是组合框列,因此用户可以选择正确的值。当我尝试添加项目数组时,出现异常:“DataGridView 中发生以下异常:System.ArgumentException:DataGridViewComboBoxCell 值无效。”

我知道组合框已使用正确的数据源正确添加,因为如果我只是将项目数组中的一些项目添加到 dataGridView1,例如项目 [0],组合框显示正常并且没有异常抛出。我想问题出在我尝试将 items 数组中的错误值添加到 dataGridView1 行时。

我不知道该如何处理。有没有办法可以添加项目中除该值之外的所有项目?或者我可以从项目中添加值并将其与填充的下拉项目一起显示在组合框单元格中吗?

if(choosenFile.Contains("Cust"))
{
var lines = File.ReadAllLines(path+"\\"+ choosenFile);

foreach (string line in lines)
{
errorCounter = 0;
string[] items = line.Split('\t').ToArray();

for (int i = 0; i <custIndex.Count; i++)
{
int index = custIndex[i];
/*Get the state and country codes from the files using the correct indices*/
Globals.Code = items[index - 1].ToUpper();

if (!CountryList.ContainsKey(Globals.Code) && !StateList.ContainsKey(Globals.Code))
{
errorCounter++;

dataGridView1.Rows.Add(items);
}
}//inner for

if (errorCounter == 0)
dataGridView2.Rows.Add(items);

}//inner for each

}//if file is a customer file

最佳答案

假设您的文本文件包含:

澳大利亚巴布亚新几内亚、印度非洲
奥地利巴厘岛印度尼西亚
法国 英格兰、苏格兰、爱尔兰 格陵兰
德国巴哈马夏威夷
希腊哥伦比亚、墨西哥、秘鲁阿根廷
新西兰俄罗斯美国

假设您的 DataGridView 设置了 3 列,第二列是组合框。

enter image description here

当您填充网格并错误地填充组合框列时,您将收到错误消息。

解决它的方法是“显式处理/声明”DataError 事件,更重要的是正确填充组合框列。

private void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e)
{
//Cancelling doesn't make a difference, specifying the event avoids the prompt
e.Cancel = true;
}

private void dataGridView2_DataError(object sender, DataGridViewDataErrorEventArgs e)
{
e.Cancel = true;
}

假设第 2 列包含一个国家/地区下拉列表,第 1 和第 3 列包含文本字段。

对于第 1 列和第 3 列,它们只是字符串,因此我创建了一个类来表示每一行:

public class CountryData
{
public string FirstCountry { get; set; }
public string ThirdCountry { get; set; }
}

对于第二列“国家”组合框单元格,我创建了一个单独的类,因为我会将它绑定(bind)到第二列数据源。

public class MultiCountryData
{
public string[] SeceondCountryOption { get; set; }
}

使用组合框列等填充网格,如下所示:https://stackoverflow.com/a/1292847/495455不是好的做法。您希望将您的业务逻辑与您的表示分离,以获得一种更加封装、多态和抽象的方法,从而简化单元测试和维护。因此,DataBinding。

代码如下:

namespace BusLogic
{
public class ProcessFiles
{

internal List<CountryData> CountryDataList = new List<CountryData>();
internal List<MultiCountryData> MultiCountryDataList = new List<MultiCountryData>();

internal void foo(string path,string choosenFile)
{
var custIndex = new List<int>();
//if (choosenFile.Contains("Cust"))
//{
var lines = File.ReadAllLines(path + "\\" + choosenFile);
foreach (string line in lines)
{
int errorCounter = 0;
string[] items = line.Split('\t');

//Put all your logic back here...

if (errorCounter == 0)
{
var countryData = new CountryData()
{
FirstCountry = items[0],
ThirdCountry = items[2]
};
countryDataList.Add(countryData);

multiCountryDataList.Add( new MultiCountryData() { SeceondCountryOption = items[1].Split(',')});

}
//}
}

}
}

在您的演示项目中,这里是按钮点击代码:

 imports BusLogic;
private void button1_Click(object sender, EventArgs e)
{
var pf = new ProcessFiles();
pf.foo(@"C:\temp","countries.txt");
dataGridView2.AutoGenerateColumns = false;
dataGridView2.DataSource = pf.CountryDataList;
multiCountryDataBindingSource.DataSource = pf.MultiCountryDataList;
}

我设置 dataGridView2.AutoGenerateColumns = false; 因为我在设计时添加了 3 列;第一个文本列、第二个组合框列和第三个文本列。

绑定(bind)第二个组合框列的技巧是 BindingSource。在设计时 > 右键单击​​ DataGridView > 选择编辑列 > 选择第二列 > 选择数据源 > 单击添加项目数据源 > 选择对象 > 然后勾选 multiCountry 类并单击完成。

enter image description here

enter image description here

同时将第 1 列的 DataPropertyName 设置为 FirstCountry,将第 3 列的 DataPropertyName 设置为 ThirdCountry,这样当您绑定(bind)数据时,映射会自动完成。

enter image description here

最后,不要忘记将 BindingSource 的 DataMember 属性设置为 multiCountry 类的 SeceondCountryOption 成员。

enter image description here

这是一个代码演示 http://temp-share.com/show/HKdPSzU1A

关于c# - 将数组的所有元素添加到 datagridview 行,除了一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13733114/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com