【发布时间】:2022-06-11 06:27:36
【问题描述】:
我一直在 C# Winforms 中将短数据绑定到 DataGridView。但是,我需要将大小为 75 的长字符串数组绑定到 DataGridView。我的数据列表类由 6 个单独的变量组成,其中包含 get 和 set 以及我定义了 get 和 set 属性的字符串数组。显示单个变量,但字符串数组未显示在 DataGridView 中。在调试中,我检查了 DataGridView 的数据源,似乎没问题。如何在 gridview 中显示绑定数组。
下面是我用来填充名为 Logview 的 DataGridView 的源代码
public void populateLogData(string path)
{
StreamReader sr = null;
BindingList<LogList> bindLogList;
BindingSource bLogsource = new BindingSource();
List<LogList> loglist = new List<LogList>();
try
{
Logview.DataSource = null;
Logview.Rows.Clear();
Logview.Columns.Clear();
Logview.AutoGenerateColumns = true;
if (File.Exists(path))
{
try
{
sr = new StreamReader(path);
StringBuilder readline = new StringBuilder(sr.ReadLine());
if (readline.ToString() != null && readline.ToString() != "")
{
readline = new StringBuilder(sr.ReadLine());
while (readline.ToString() != null && readline.ToString() != "")
{
string[] subdata = readline.ToString().Split(',');
LogList tloglist = new LogList(subdata[0], subdata[1], subdata[2], subdata[3], subdata[4], subdata[5], max_index);
for (int i = 6; i < subdata.Length; i++)
tloglist.setPartList(i-6, subdata[i]);
loglist.Add(new LogList(subdata, subdata.Length));
readline = new StringBuilder(sr.ReadLine());
}
}
bindLogList = new BindingList<LogList>(loglist);
bLogsource.DataSource = bindLogList;
Logview.AutoGenerateColumns = true;
Logview.DataSource = bindLogList;
Logview.Columns[0].Width = 140; // project name
Logview.Columns[1].Width = 140; // data/time
Logview.Columns[2].Width = 90;
Logview.Columns[3].Width = 90;
Logview.Columns[4].Width = 90;
Logview.Columns[5].Width = 90;
// max_index is set from another part of code
for(int i = 0; i <= max_index; i++)
{
int counter = 6 + i;
Logview.Columns.Add(headertext[i], headertext[i]);
Logview.Columns[counter].Width = 90;
Logview.Columns[counter].HeaderText = headertext[i];
}
}
catch (IOException io)
{
MessageBox.Show("Error: Cannot Open log file.");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
if (sr != null) sr.Close();
}
}
else
{
MessageBox.Show("Log file not found \n" + path);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
GC.Collect();
}
}
下面是LogList类
class LogList
{
const int max_size = 100;
private string[] holdList;
public string project { get; set; }
public string date_time { get; set; }
public string Qty { get; set; }
public string Pass { get; set; }
public string Fail { get; set; }
public string Result { get; set; }
public string[] partlist
{
get
{
return holdList;
}
set
{
holdList = value;
}
}
public LogList(string project, string date_time, string Qty, string Pass, string Fail, string Result, int partsize)
{
this.project = project;
this.date_time = date_time;
this.Qty = Qty;
this.Pass = Pass;
this.Fail = Fail;
this.Result = Result;
partlist = new string[partsize+1];
}
public void setPartList(int size, string getValue)
{
partlist[size] = getValue;
}
}
显示项目、日期/时间、数量、通过、失败、结果。但是没有显示partlist数组。
【问题讨论】:
-
您到底希望看到什么?
DataGridView无法提供有用的数组表示。最好是调用ToString,在这种情况下你会得到“System.Array”之类的。 -
查看
LogList类……partlist是一个string[]数组。当您设置网格DataSource时,它将绑定所有公开公开的原始属性类型,如bool、string、int…等。但是,它不会绑定类的“属性”其他类或集合。在这种情况下,partlist是一个“集合”,网格不知道如何将“多个”值添加到单个单元格中。您将不得不展平partlist项目或以主从方式使用两个网格。 -
@JohnG 我猜这就是原因。 “扁平化部分列表”是否意味着无论数组有多大,我都必须将所有项目单独分配到单独的公共属性中?
-
““扁平化partlist”是否意味着无论数组有多大,我都必须将所有项目单独分配到单独的公共属性中?” ...从技术上讲,是的...但是... 不... 因为数组可以是任意大小,所以您必须检查每个
partlist大小以查看哪个列表最长,然后才能在网格中创建适当数量的列。此外,这可能会使许多单元格“空白”并且永远不会被使用。因此,以这种方式展平数据并不是一个好主意。 -
然而,解决这个问题的一种“简单”方法……是在
LogList类中创建另一个属性。类似“AllPartsString”的东西。在get属性中,您可以创建一个新的StringBuilder,并通过一个foreach循环遍历所有partlist项。创建一个包含所有零件值的“单个”字符串。然后在数据绑定到网格时会创建此列。授予“一个”(1) 单元格将包含该单个LogList项目的所有部分。
标签: c# visual-studio winforms data-binding datagridview