1

我有一种方法可以从数据库中提取 url 名称(varchar)、urlID(int)及其启用状态(位),并将结果填充到 foreach 循环上的 CheckedListBox 中。我遇到的问题是checkboxlist 似乎只取了一个名字和它的选中状态。我需要做的是,当用户完成对按钮事件的选择时,它会读取 CheckedListBox 并获取 URL ID,并启用状态,以便我可以将其写回数据库。

这是我正在使用的代码:

/// <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);
    }
}
4

3 回答 3

8

第 1 步:创建一个类来保存 Name 和 Id,并使用返回 Name 的 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);
    }
}
于 2011-02-01T15:37:09.653 回答
1

您最好创建一个包含string(您的 url)和int(id)的简单类,重写ToString()返回 url 的方法,并将这些对象添加ItemsCheckedListBox. 当您获得选定的对象时,您只需将其转换为您的新类,您就可以访问这两个属性。

就像是:

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);
于 2011-02-01T15:34:49.040 回答
0

这个控件有一个值成员和一个显示成员。我认为如果您使用名称作为显示成员并将 ID 作为值成员,您可以做您需要的事情。

于 2011-02-01T15:27:00.667 回答