我有一个CheckedListBox
有 X 个项目。这些项目在运行时放置在那里。这些项目应该代表可以在DataGridView
. 我现在需要做的是在报告名称旁边的括号中显示每个报告的记录数。我尝试编辑项目的实际名称,但时间不长,但不知道该怎么做。所以,我蛮力的强迫它。将项目保存到数组中,清除项目,将记录计数附加到数组中的每个项目,创建新项目。好吧,这引起了问题,因为现在它没有保留我的支票,原因是每当我生成报告时,我都会清除项目并重新创建它们。好吧,而不是做另一个foreach
循环保存检查状态,有没有人知道改变现有项目文本的方法CheckedListBox
?
这是我目前拥有的代码:
在 MainForm.Designer.cs 中:
this.clbReports.Items.AddRange(new object[] {
"Report 1",
"Report 2",
"Report 3",
"Report 4",
"Report 5",
"Report 6",
"Report 7",
"Report 8",
"Report 9",
"Report 10",
"Report 11"});
它看起来像:
我希望它看起来像(但不会全是 0):
这是 SelectedIndexChanged 函数:
private void clbReports_SelectedIndexChanged(object sender, EventArgs e)
{
string strCheckBox = clbReports.SelectedItem.ToString();
bool bShowAllIsChecked = clbReports.GetItemChecked(clbReports.FindString("Show All Error Reports"));
bool bSelected = clbReports.GetItemChecked(clbReports.FindString(strCheckBox));
int nIndex = -1;
if (strCheckBox.Contains("Show All Error Reports"))
{
foreach (string str in _strReports)
{
if (!str.Contains("Show All Error Reports") && !str.Contains("Show Tagged Records"))
{
nIndex = clbReports.FindString(str);
if (nIndex > -1)
{
clbReports.SetItemChecked(nIndex, bSelected);
}
}
}
}
else
{
if (strCheckBox.Contains("Show All Error Reports") || bShowAllIsChecked)
{
foreach (string str in _strReports)
{
nIndex = clbReports.FindString(str);
if (nIndex > -1)
{
clbReports.SetItemChecked(nIndex, false);
}
}
}
nIndex = clbReports.FindString(strCheckBox);
if (nIndex > -1)
{
clbReports.SetItemChecked(nIndex, bShowAllIsChecked ? true : bSelected);
}
}
string[] strCheckedItems = new string[clbReports.CheckedItems.Count];
clbReports.CheckedItems.CopyTo(strCheckedItems, 0);
List<string> checkBoxReportFilter = new List<string>();
foreach (ReportRecord obj in this._lstReportRecords)
{
foreach (string str in strCheckedItems)
{
if (str.Contains(obj.Description))
{
checkBoxReportFilter.Add(obj.PartID.ToString());
}
}
}
try
{
if (checkBoxReportFilter.Count == 0 && clbReports.CheckedItems.Count > 0)
{
throw new NullReferenceException();
}
_strReportFilter = String.Join(",", checkBoxReportFilter.ToArray());
}
catch (NullReferenceException)
{
_strReportFilter = "-1";
}
generateReport();
}
这是我清除项目、获取报告计数和创建新项目的代码。
_lstReportRecords = _dataController.ReportList;
bool[] bChecked = new bool[clbReports.Items.Count];
int nCounter = 0;
foreach (string str in _strReports)
{
foreach (string str2 in clbReports.SelectedItems)
{
bChecked[nCounter] = str2.Contains(str);
}
nCounter++;
}
clbReports.Items.Clear();
nCounter = 0;
foreach (string str in _strReports)
{
int nCount = _lstReportRecords.Where<ReportRecord>(delegate(ReportRecord rr) {
return rr.Description == str;
}).Count();
string newReport = str + " (" + nCount + ")";
clbReports.Items.Add(newReport);
clbReports.SetItemChecked(nCounter, bChecked[nCounter]);
nCounter++;
}
请告诉我有一种更简单的方法可以做到这一点。我尝试通过 clbReports.Items 进行 foreach 循环,但它希望我将其转换为字符串(尝试转换为 CheckBox 时出错),因此我无法更改值。即使我可以将它转换为 CheckBox,我也有一种感觉,它会给我一个错误,即枚举失败,因为列表已更改(或者他们怎么说)。欢迎任何和所有帮助。谢谢。
编辑:请知道报告 X 只是为了不显示实际报告名称以保持其通用性。但是,在代码中,我只是复制和粘贴,所以 Show All Error Reports 和 Show All Tagged Records 是我需要检查的报告。