Как я могу получить идентификатор элемента в CheckedListBox? - PullRequest
1 голос
/ 01 февраля 2011

У меня есть метод, который извлекает URL-адрес (varchar), urlID (int) и его статус Enabled (бит) из базы данных и заполняет результаты в CheckedListBox в цикле foreach.Проблема, с которой я столкнулся, заключается в том, что флажок в списке проверяется только на имя и проверенный статус.То, что мне нужно сделать, - это когда пользователь закончил с выборами для события кнопки, он читает CheckedListBox и получает URL-адрес, а также включенный статус, чтобы я мог затем записать это обратно в базу данных.Это код, который я использую:

/// <summary>
/// Create url names in check box list.
/// </summary>
/// <param name="rows"></param>
private void CreateURLCheckBoxes(DataRowCollection rows)
{
    try
    {
        int i = 0;
        foreach (DataRow row in rows)
        {
            //Gets the url name and path when the status is enabled. The status of Enabled / Disabled is setup in the users option page
            string URLName = row["URLName"].ToString();
            int URLID = Convert.ToInt32(row["URLID"]);
            bool enabled = Convert.ToBoolean(row["Enabled"]);

            //Adds the returned to rows to the check box list
            CBLUrls.Items.Add(URLName, enabled);

        }
        i++;
    }

    catch (Exception ex)
    {
        //Log error
        Functionality func = new Functionality();
        func.LogError(ex);

        //Error message the user will see
        string FriendlyError = "There has been populating checkboxes with the urls ";
        Classes.ShowMessageBox.MsgBox(FriendlyError, "There has been an Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

Ответы [ 3 ]

6 голосов
/ 01 февраля 2011

Шаг 1. Создайте класс для хранения имени и идентификатора с переопределением ToString (), которое возвращает имя

public class UrlInfo
{
    public string Name;
    public int Id;
    public bool Enabled;

    public override string ToString()
    {
        return this.Name;
    }
}

Шаг 2. Добавьте экземпляры этого класса в свой CheckedListBox

 UrlInfo u1 = new UrlInfo { Name = "test 1", Id = 1, Enabled = false };
 UrlInfo u2 = new UrlInfo { Name = "test 2", Id = 2, Enabled = true };
 UrlInfo u3 = new UrlInfo { Name = "test 3", Id = 3, Enabled = false };

 checkedListBox1.Items.Add(u1, u1.Enabled);
 checkedListBox1.Items.Add(u2, u2.Enabled);
 checkedListBox1.Items.Add(u3, u3.Enabled);

Шаг 3. Приведите SelectedItem к UrlInfo и получите .Id

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
    UrlInfo urlInfo = checkedListBox1.Items[e.Index] as UrlInfo;
    if (null != urlInfo)
    {
        urlInfo.Enabled = e.NewValue == CheckState.Checked;
        Console.WriteLine("The item's ID is " + urlInfo.Id);
    }
}
1 голос
/ 01 февраля 2011

Вам лучше создать простой класс, содержащий string (ваш URL-адрес) и int (идентификатор), переопределить метод ToString() для возврата URL-адреса и добавить эти объекты в Items собственность CheckedListBox. Когда вы получаете выбранный объект, вам просто нужно привести его в новый класс, и вы можете получить доступ к обоим свойствам.

Что-то вроде:

public class MyClass
{
    public string Url { get; set; }
    public int Id { get; set; }
    public override string  ToString()
    {
         return this.Url;
    }
}

А потом при добавлении объектов:

CBLUrls.Items.Add(new MyClass { Id = URLID, Url = URLName }, enabled);
0 голосов
/ 01 февраля 2011

Этот элемент управления имеет элемент Value и элемент Display.Я думаю, что вы можете делать то, что вам нужно, если вы используете имя в качестве отображаемого элемента и идентификатор в качестве значения элемента.

...