我有一个CheckedListBox,我想在一个项目被检查后我想要一个事件,以便我可以使用具有新状态的CheckedItems.
由于在CheckedItems更新之前触发了ItemChecked,因此它不会开箱即用.
更新CheckedItems时,我可以使用哪种方法或事件来通知?
我有一个CheckedListBox,我想自动勾选其中的一个项目.
该CheckedItems
集合不允许您向其添加内容.
有什么建议?
我的谷歌技能让我失望.任何人都听说过像WPF这样的控件.我试图让它看起来像这样(winforms截图).
我在C#中的WinForm上使用了CheckedListBox.我已经限制了这个控制,如下所示 -
chlCompanies.DataSource = dsCompanies.Tables[0];
chlCompanies.DisplayMember = "CompanyName";
chlCompanies.ValueMember = "ID";
Run Code Online (Sandbox Code Playgroud)
我可以获得已检查项目的索引,但我如何获得检查项目文本和值.而是如何通过CheckedItems枚举访问文本和值?
谢谢你分享你的时间.
CheckedListBox
使用鼠标单击时,WinForms 控件有2个默认行为:
作为一项便利功能,我需要允许用户一键切换选择.我已经实现了这一点,所以现在只需点击一下即可实现上面的默认行为#1.问题是当单击相同(即当前选定的)项目时,行为#2不再正常工作.它在项目之间跳转时工作正常,这是理想的,但同一项目最多需要4次点击.
我的解决方法是,如果用户重复选择相同的项目,则调用两次切换逻辑.关于我的问题:
奇怪的是,调试代码显示已检查状态已更改但在UI方面没有出现,直到它被调用两次.我认为它可能与线程相关,但它不是一个可能需要BeginInvoke
使用的可重入事件.
这是我的代码:
using System.Linq;
using System.Windows.Forms;
namespace ToggleCheckedListBoxSelection
{
public partial class Form1 : Form
{
// default value of -1 since first item index is always 0
private int lastIndex = -1;
public Form1()
{
InitializeComponent();
CheckedListBox clb = new CheckedListBox();
clb.Items.AddRange(Enumerable.Range(1, 10).Cast<object>().ToArray());
clb.MouseClick += clb_MouseClick;
this.Controls.Add(clb);
}
private void clb_MouseClick(object sender, MouseEventArgs e)
{
var clb = (CheckedListBox)sender;
Toggle(clb);
// call toggle method …
Run Code Online (Sandbox Code Playgroud) 这似乎是一个基本上简单的问题.我有一个带有列表框的WinForms对话框.此控件不是通过数据绑定填充,而是通过调用填充
listBox.Items.Add (obj);
Run Code Online (Sandbox Code Playgroud)
这个调用可能是从各个地方异步进行的,我想挂钩列表框并观察其数据成员的变化,以便我可以执行其他UI更改(例如启用或禁用与基于列表框交互的控件关于列表中的项目数).
不幸的是,除非我完全无能为力,否则似乎没有一个事件或虚拟方法可以被钩住来检测这一点.我可以挂钩选择更改和(对于CheckedListBox)我可以挂钩检查状态更改.但不是对基础数据集的更改.
我知道这在Win32中是可能的(有一个窗口消息).我错过了什么?
[西蒙编辑]
我被指向正确的解决方案(我已经标记为已接受的答案),它将覆盖ListBox的WndProc方法并手动处理列表框消息.这是我确定(并且有效)的解决方案.可以对其进行修改以在事件中提供更多详细信息,或将消息拆分为单独的事件,但是对于我的需求,这已足够.
using System;
using System.Windows.Forms;
public class CheckedListBoxEx : CheckedListBox
{
public CheckedListBoxEx() { }
private const int LB_ADDSTRING = 0x180;
private const int LB_INSERTSTRING = 0x181;
private const int LB_DELETESTRING = 0x182;
private const int LB_RESETCONTENT = 0x184;
protected override void WndProc(ref Message m)
{
if (m.Msg == LB_ADDSTRING ||
m.Msg == LB_INSERTSTRING ||
m.Msg == LB_DELETESTRING ||
m.Msg == LB_RESETCONTENT)
{
ItemsChanged(this, EventArgs.Empty);
}
base.WndProc(ref m);
}
public …
Run Code Online (Sandbox Code Playgroud) 当用户的鼠标放在CheckedListBox中的项目上时,是否有一种直接的方法来设置其他文本出现在工具提示中?
我希望能够在代码中做到的是:
uiChkLstTables.DisplayOnHoverMember = "DisplayOnHoverProperty"; //Property contains extended details
Run Code Online (Sandbox Code Playgroud)
任何人都能指出我正确的方向吗?我已经找到了一些文章,涉及检测鼠标当前所在的项目并创建一个新的工具提示实例,但这听起来有点过于设计,不是最好的方法.
提前致谢.
在checkedlistbox中单击某个项目时,它会突出显示.如何防止这种突出显示效果?
我可以挂钩到SelectedIndexChanged事件并清除选择,但突出显示仍然发生,你看到一个blip.事实上,如果您按住鼠标单击,在单击复选框区域后从不释放它,选择将保持突出显示,直到您释放鼠标按钮.我基本上想完全摆脱这种突出效果.
我正在开发Winform,我需要一个checkedlistbox.我将值存储在具有List属性的对象中:
public static class Fields
{
public static IList<string> FieldList { get; set; }
static Fields()
{ ...//populate FieldList }
}
Run Code Online (Sandbox Code Playgroud)
现在我希望我的CheckedListBox使用Fields.FieldList作为数据源.在线搜索后,我发现我需要设置
//in myForm_Load
mycheckedListBox.DataSource = Fields.FieldList;
Run Code Online (Sandbox Code Playgroud)
但myCheckedListBox没有DataSource属性.
我在这里错过了什么吗?
在我的CheckedListBox
应用程序中,我想只允许检查一个项目.
我已经设置了这些属性
checkOnClick = true;
SelectionMode = One;
Run Code Online (Sandbox Code Playgroud)
任何建议将不胜感激