Ama*_*nda 6 c# datagridview winforms
我正在逐行读取文本文件,并将其插入到数组中.
然后,我有一个名为custIndex的列表,它包含某些索引,我正在测试的items数组的索引,看它们是否是有效的代码.(例如,custIndex [0] = 7,所以我检查项目[7-1]中的值,看看它是否有效,在我这里的两个词典中).然后,如果代码无效,我将行(items数组)添加到dataGridView1.
问题是,dataGridView1中的一些列是组合框列,因此用户可以选择正确的值.当我尝试添加items数组时,我得到一个异常:"DataGridView中发生以下异常:System.ArgumentException:DataGridViewComboBoxCell值无效."
我知道组合框已正确添加正确的数据源,因为如果我只是将items数组中的一些项添加到dataGridView1,就像items [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
Run Code Online (Sandbox Code Playgroud)
假设您的文本文件包含:
澳大利亚PNG,印度非洲
奥地利巴厘岛Indonisia
法国英格兰,苏格兰,爱尔兰格陵兰
德国巴哈马夏威夷
希腊哥伦比亚,墨西哥,秘鲁阿根廷
新西兰俄罗斯美国
并且假设您的DataGridView设置为3列,第2列是组合框.

当您填充网格并错误地填充组合框列时,您将收到错误.
解决它的方法是"显式处理/声明"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;
}
Run Code Online (Sandbox Code Playgroud)
因此,想象第二列包含国家/地区的下拉列表,第一列和第三列包含文本字段.
对于第1列和第3列,它们只是字符串,因此我创建了一个表示每一行的类:
public class CountryData
{
public string FirstCountry { get; set; }
public string ThirdCountry { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
对于第二列"Countries"组合框单元格,我创建了一个单独的类,因为我将它绑定到第二列数据源.
public class MultiCountryData
{
public string[] SeceondCountryOption { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
使用组合框列等填充网格,如下所示: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(',')});
}
//}
}
}
}
Run Code Online (Sandbox Code Playgroud)
在您的演示文稿项目中,这里是按钮单击代码:
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;
}
Run Code Online (Sandbox Code Playgroud)
我设置dataGridView2.AutoGenerateColumns = false;是因为我在设计时添加了3列; 第一个文本列,第二个组合框列和第三个文本列.
绑定第二个组合框柱的技巧是a BindingSource.在设计时>右键单击DataGridView>选择Edit Columns>选择第二列>选择DataSource>单击Add Project DataSource>选择Object>然后勾选multiCountry类并单击Finish.


还将第1列的DataPropertyName设置为FirstCountry,将第3列的DataPropertyName设置为ThirdCountry,因此在绑定数据时,映射会自动完成.

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

这是一个代码演示http://temp-share.com/show/HKdPSzU1A
| 归档时间: |
|
| 查看次数: |
4249 次 |
| 最近记录: |