Как мне изменить имя элемента в CheckedListBox ?

У меня есть 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"});

И он выглядит так:

alt text

И я хочу, чтобы он выглядел так (но не все будут нули) :

alt text

Вот функция 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, я чувствую, что это даст мне ошибку, что Enumeration не удалось, потому что список был изменен (или как они это называют). Любая помощь приветствуется. Спасибо.

Редактировать: Пожалуйста, знайте, что Отчет X предназначен только для того, чтобы не отображать фактические имена отчетов, чтобы они были общими. Однако в коде я просто скопировал и вставил, поэтому мне нужно проверить отчеты "Показать все отчеты об ошибках" и "Показать все отмеченные записи".

1
задан John Saunders 8 September 2010 в 15:06
поделиться