我有一个小问题,几个小时一直让我烦恼。
在我的WinForms(.NET 3.5)应用程序中,我在运行时在TableLayoutPanel中创建一些ComboBox(DropDownStyle = DropDown)并用字符串填充它。组合框配置为自动调整大小(Anchor = Left | Right)。
问题在于每当调整ComboBox的大小(即调整对话框大小)时,ComboBox的编辑框部分将被完全选中/突出显示。在我看来,这给我想要避免的客户造成了非常混乱的影响。
如果ComboBox具有固定大小,则不会出现此问题。
另请注意,更改DropDownStyle不是一个选项 - 我需要手动输入文本。
我已经尝试过使用覆盖OnPaint方法,但这种方法并不常用。 我也尝试清除ComboBox.Resize事件中的选择,它在某种程度上起作用,但似乎是一个非常难看的解决方案 - 有很多闪烁,故意选择的文本被取消选择,我将不得不为每个添加事件处理程序和我对话框中的每个ComboBox。
这个问题有更好的解决方案吗?
提前谢谢。
此致 安迪
答案 0 :(得分:13)
这是一个老问题,但我发现它正在寻找答案并最终实现了我自己的解决方案。不妨把它贴在这里,对吧?
foreach (var cb in Controls.OfType<ComboBox>())
{
cb.Resize += (sender, e) => {
if (!cb.Focused)
cb.SelectionLength = 0;
};
}
有意选择的文字被取消选择
此WinForms错误不会影响选定的ComboBox,因此通过忽略具有Focus的那些,我们会处理丢失当前选择的问题。
我必须添加事件处理程序 我的每一个ComboBox 对话框。
由foreach循环照顾。如果您不想破坏设计器,或者让设计师破坏它,请将它放在InitializeComponent()或.ctor中。
有很多闪烁
如果我快速调整大小,我只会看到闪烁,但我在Win7上,所以在XP上可能会有所不同。
答案 1 :(得分:2)
哇。谢谢你们!
显然这个错误持续了很多年。 我正在使用.Net 4(Visual Studio 2010)构建UserControl。 这是我的bsneeze代码的轻微修改版本。
干杯
using System.Windows.Forms;
using System.Linq;
public MyUserControlCtor()
{
InitializeComponent();
foreach( Control ctrl in Controls)
{
ComboBox cb = ctrl as ComboBox;
if (cb != null)
{
cb.Resize += (sender, e) =>
{
if (!cb.Focused)
this.FCHZ_ComboBox.SelectionLength = 0;
};
}
}
}
答案 2 :(得分:1)
到目前为止,没有一个答案对我有用。我发现唯一可靠的方法是通过BeginInvoke
异步发布消息,在控件上的所有其他活动完成后将SelectionLength
设置回零。闪烁的数量非常烦人且不专业,但这是我能想到的最好的......到目前为止。
internal class FixedComboBox : ComboBox
{
protected override void OnResize(EventArgs e)
{
if (IsHandleCreated && !Focused)
{
BeginInvoke((Action)(() =>
{
SelectionLength = 0;
}));
}
base.OnResize(e);
}
}
答案 3 :(得分:0)
我发现,对于组合框上的组合框的选择长度设置为0,无论控制组合框处于何种控制状态,都会导致批次减少闪烁而不是在调整大小时执行此操作组合本身。
我实际上是在VB.Net中实现了这一点,但它应该应用于C#。
答案 4 :(得分:0)
处理ComboBox的父容器的Resize事件。把这一行放在那里:
MyComboBox.SelectionLength = 0
一个例子(显然是VB):
Private Sub MyControl_Resize(sender As Object, e As EventArgs) Handles Me.Resize
MyComboBox.SelectionLength = 0
End Sub
祝你好运!
- BP
答案 5 :(得分:0)
这似乎是ComboBox
与DropDownStyle
DropDown
的原生Windows实施中的错误。
此处其他答案中详述的修补程序(在SelectionLength
的{{1}}事件中将ComboBox
属性设置为0(零))在大多数情况下运行良好。
然而,我发现即使解决这个问题的修复也并不总是有效。如果Resize
位于ComboBox
中,并且TableLayoutPanel
包含多个TableLayoutPanel
大小类型的列,则该修复通常不起作用。
一张图片胜过千言万语。请参阅以下用于演示此问题的表单的屏幕截图。
答案 6 :(得分:0)
为我工作时,namestringn = dataset.Tables(0).Rows(i).Item(11).ToString().Trim
namestringn = New String((From c As Char In namestringn() Select c Where
Char.IsDigit(c)).ToArray())
被调用时将selectionLength更改为0。
即使将tableLayoutPanel设置为%也可以使用。
WM_WINDOWPOSCHANGED
答案 7 :(得分:0)
对于 TableLayoutPanel 内的 ComboBox,在 ComboBox.Resize 事件上设置 .SelectionLength = 0 不起作用,但在 TableLayoutPanel.Resize 事件上这样做:
Private Sub TableLayoutPanel_Resize(sender As Object, e As EventArgs)
Dim curr_panel = TryCast(sender, System.Windows.Forms.TableLayoutPanel)
For Each curr_combo As ComboBox In curr_panel.Controls.OfType(Of ComboBox)
If ((Not curr_combo.Focused) And curr_combo.DropDownStyle = ComboBoxStyle.DropDown) Then
curr_combo.SelectionLength = 0
End If
Next
End Sub
dim panel as new TableLayoutPanel with {
...
}
AddHandler panel.Resize, AddressOf TableLayoutPanel_Resize