我在c#中有一个Windows窗体应用程序,其中有多个列表框中的数据列表(每个列表框中大约56个)。 这是一个例子:
列表继续学生数据。 现在我需要在按钮单击事件中打印excel中的数据。 数据应按顺序排列。
我尝试使用CSV帮助程序但它只帮助我获得了一组列表框,我需要从多个列表框中发送数据。
var sw = new StreamWriter(@"output.csv");
var csvWriter = new CsvHelper.CsvWriter(sw);
foreach (var Name in lbx.Items)
{
csvWriter.WriteField(Name);
csvWriter.NextRecord();
}
foreach (var Address in ptr.Items)
{
csvWriter.WriteField(Address);
}
sw.Flush();
然而,这并没有解决问题。有关解决此问题的任何帮助都会有所帮助。 解决问题的任何其他方法都会很棒。
答案 0 :(得分:0)
我很难确定您的配置的完整详细信息,但如果它就像您为其编写值的两个ListBox
控件一样简单,那么您很容易做类似以下的事情:
var sw = new StreamWriter(@"output.csv");
var csvWriter = new CsvHelper.CsvWriter(sw);
int lbxCount = lbx.Items.Count;
int ptrCount = ptr.Items.Count;
for (int i = 0; i < Math.Max(lbx.Items.Count, ptr.Items.Count); i++)
{
object lbxValue = lbxCount > i ? lbx.Items[i] : String.Empty;
object ptrValue = ptrCount > i ? ptr.Items[i] : String.Empty;
csvWriter.WriteField(lbxValue);
csvWriter.WriteField(ptrValue);
csvWriter.NextRecord();
}
sw.Flush();
sw.Close();
根据最大Math.Max(lbx.Items.Count, ptr.Items.Count
确定要写入的最大记录数(ListBox.Items.Count
。
通过将循环更改为单个循环,您现在可以正确使用WriteField
方法。如果ListBox lbx
不包含特定记录的值,则使用String.Empty
作为该记录的值。同样,如果ListBox ptr
中有更多项目,lbx
也会如此。
如果您在单个表单上有多个ListBox
控件并希望每个控件都有,那么您可以通过遍历所有ListBox
控件并获取各自的Item.Count
来确定总体最大项数值如下:
var sw = new StreamWriter(@"output.csv");
var csvWriter = new CsvHelper.CsvWriter(sw);
int maxRecords = 0;
List<ListBox> listBoxes = new List<ListBox>();
// Add all ListBox controls to list
// Determine maximum number of items (in all ListBox controls)
foreach (Control control in Controls)
{
if (control.GetType() == typeof(ListBox))
{
ListBox currentListBox = (ListBox)control;
listBoxes.Add(currentListBox);
if (currentListBox.Items.Count > maxRecords)
maxRecords = currentListBox.Items.Count;
}
}
// Write fields for each ListBox
for (int i = 0; i < maxRecords; i++)
{
foreach (ListBox currentListBox in listBoxes)
{
if (currentListBox.Items.Count > i)
csvWriter.WriteField(currentListBox.Items[i]);
else
csvWriter.WriteField(String.Empty);
}
csvWriter.NextRecord();
}
sw.Flush();
sw.Close();