У меня есть CheckedListBox
, который имеет X количество элементов. Эти элементы размещаются там во время выполнения. Эти элементы должны представлять отчеты, которые могут отображаться в DataGridView
. Теперь мне нужно показать количество записей для каждого отчета в скобках рядом с именем отчета. Я пытался, не слишком долго, редактировать фактическое имя элемента, но не смог узнать, как это сделать. Итак, я переборщил. Сохраняли элементы в массиве, очищали элементы, добавляли количество записей к каждому элементу массива, создавали новые элементы. Ну, это вызвало проблемы, потому что теперь оно не удерживает мои чеки, и причина в том, что всякий раз, когда я создаю отчеты, я очищаю их и воссоздаю. Ну, вместо того, чтобы делать еще один цикл foreach
, чтобы сохранить проверенный статус, знает ли кто-нибудь об изменении текста существующих элементов в CheckedListBox
?Как изменить имя элемента в 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++;
}
Скажите, пожалуйста, что есть более простой способ сделать это. Я пробовал делать петли foreach через clbReports.Items, но он хочет, чтобы я применил его к строке (с ошибкой при попытке применить к CheckBox), поэтому я не мог изменить значение. И даже если бы я мог передать его в CheckBox, у меня возникло ощущение, что он даст мне ошибку, которую перечислил, потому что список был изменен (или, как бы то ни было, они его называют). Любая помощь приветствуется. Благодарю.
Редактировать: Пожалуйста, имейте в виду, что отчет X предназначен только для того, чтобы фактические имена отчетов не отображались, чтобы сохранить их общий. Однако в коде я просто скопировал и вставил, чтобы показать все отчеты об ошибках и показать все отмеченные записи - отчеты, которые мне нужно проверить.
Вам не нужно, если strCheckBox.Contains («Показать все отчеты об ошибках») в инструкции else из clbReports_SelectedIndexChanged, потому что это никогда не будет правдой, поскольку все они войдут в раздел «если», а не другое. Просто немного, но это поможет сохранить код более четким. – w69rdy
Почему не просто 'int nCount = _lstReportRecords.Where (rr => rr.Description == str)' вместо запутанного пути? – Timwi
@ Тимви - Честно говоря, потому что я не знал, что это был более простой способ. :) Я думал, что вам нужно сделать это подобно javascript, где вы определяете функцию. Это теперь изменяется в моем коде .... во ВСЕХ местах, где я так делал. :) – XstreamINsanity