Tag: winforms

如何使用TreeViewDrawMode.OwnerDrawAll更改TreeView中所选节点的背景颜色?

当选择节点并具有焦点时,我需要更改所选节点的颜色 – 返回颜色变为绿色,选中但没有焦点 – 红色。 我无法区分选定的节点与焦点在树视图和没有。 位于TabPage对象中的树视图。 //… this.myTreeView.HideSelection = false; //… private void myTreeView_drawNode(object sender, DrawTreeNodeEventArgs e) { Color backColorSelected = System.Drawing.Color.Green; Color backColor = System.Drawing.Color.Red; // node selected and has focus if (((e.State & TreeNodeStates.Selected) != 0) && (this.myTabControl.Focused)) // this doesn’t work, node is always red { using (SolidBrush brush = new […]

识别CheckedListBox项已被选中

我从来没有处理过checkedListBox1。 我想要制作的程序将受益于使用它而不必使用多个复选框。 我有代码: private void checkedListBox1_SelectedIndexChanged(object sender, EventArgs e) { int selected = checkedListBox1.SelectedIndex; this.Text = checkedListBox1.Items[selected].ToString(); } 这个问题是每次我点击框并突出显示,然后选择突出显示的对象。 我正在寻找的是识别所选内容的变化,而不是突出显示。 我还想知道的是,如果检查CheckListBox中的第一个索引项以及第三个索引项,我将如何检查它是否为真? 我确信我最终会弄明白,但看到代码会非常有帮助。 假设我有3个盒子:盒子A = messageBox.Show(“a”); 方框B = messageBox.Show(“b”); 方框C = messageBox.Show(“c”); 如果选中此框,它将仅显示mbox。 我想知道的是我如何检查它是否检查,例如,A和C是否被检查,以便如果我按下一个按钮,两个messageBoxes将显示“a”然后“c”

绑定数据更改时Winforms列表框不更新

下图显示了我的代码的工作原理。 当我按下按钮2时,列表框会更新,但不会在我按下按钮1时更新。 为什么? 伪代码http://sofzh.miximages.com/c%23/mj69oj.gif 问题线程是否相关? 如果是,我应该在哪里添加对(Begin)Invoke的调用? 需要注意的一件有趣的事情是,如果我先按button1然后按下按钮2,当我点击button2时会显示button1点击生成的数据。 所以似乎doFoo生成的数据在某处缓冲,然后在按下button2后推送到列表框。 编辑: 我尝试将AddNumber添加到表单代码中,并在listBox1.InvokeRequired返回true时添加对Invoke的调用。 这解决了问题,但不是最好的设计。 我不希望GUI必须“担心”如何将项添加到模型的一部分列表中。 如何在添加到列表类内部列表的同时保持逻辑,同时在列表更改时仍然更新gui? 编辑2: 现在我们已经确认这是一个线程问题,我已经更新了图像,以更接近地反映我正在处理的实际代码的设计。 虽然Lucero的建议仍然解决了这个问题,但我希望能找到一些不需要表格来了解dll或CDllWrapper的东西。 模型(ListBoxDataBindingSource等)应该对视图一无所知(列表框,按钮,标签等)

以基本forms定义的自定义属性在重建时会以inheritance的forms丢失其状态

我在使用基本forms的属性时遇到问题,而这些属性没有以inheritance的forms维护状态。 环境: Visual Studio 2010 Ultimate Service Pack 1:版本10.0.40219.1 SP1Rel .Net Framework:版本4.0.30319 SP1Rel Windows 7旗舰版 下面是重现的源代码和步骤: using System; using System.ComponentModel; using System.Windows.Forms; namespace Test { public partial class BaseForm : Form { [DefaultValueAttribute(true)] public bool ControlVisible { get { return this.checkBox1.Visible; } set { this.checkBox1.Visible = value; } } [DefaultValueAttribute(false)] public bool ControlChecked { get […]

鼠标停止时MouseHover不会触发

我正在开发一个WordSearch拼图程序(也称为WordFind),你必须找到大量字母中的某些单词。 我正在使用C#WinForms。 我的问题是当我想点击并按住1个字母( Label ),然后拖动到其他字母以更改其ForeColor 。 我试过谷歌搜索但无济于事。 这是我有的: foreach (Letter a in game.GetLetters()) { this.Controls.Add(a); a.MouseDown += (s, e2) => { isDown = true; a.ForeColor = Color.Yellow; }; a.MouseUp += (s, e2) => { isDown = false; }; a.MouseHover += (s, e2) => { if (isDown) a.ForeColor = Color.Yellow; }; } 但是,除非未按下鼠标,否则MouseHover事件永远不会触发。 也没有运气与MouseEnter交换MouseHover 。 所以,我保留了MouseDown和MouseUp事件,并尝试在表单中使用MouseHover: […]

在调用ApplyResources之后重新应用动态添加的UserControl的布局

在WinForms应用程序中, Panel用作占位符以将单个用户控件显示为导航策略:每当用户希望导航到给定区域时,相应的用户控件将添加到Panel。 简化: contentPanel.Controls.Clear(); userControl.Dock = DockStyle.Fill; contentPanel.Controls.Add(userControl); 由于要求不受我的控制,表单必须支持动态切换语言。 这是使用Hans Passant的答案实现并正常工作,并修改使用用户控件的资源管理器,该管理器正确获取并将本地化文本应用于控件。 但是,在从User Control的相应资源文件中应用资源之后, DockStyle.Fill导致的布局将丢失,因为User Control的组成控件本身并未设置为具有DockStyle.Fill 。 这会导致控件不再拉伸以填充可用区域,并且仅限于设计器/资源文件中定义的原始大小。 请注意,在应用资源后,User Control的Dock属性仍然正确设置为DockStyle.Fill 。 我创建了一个示例应用程序来说明/重现问题:下面的表单有一个面板,动态添加用户控件并设置为DockStyle.Fill 。 用户控件的标签位于默认语言环境的左上角和德语语言环境的右上角。 我希望表单捕捉标签,该标签固定在表单右边缘的右侧,但用户控件的大小会重置为设计时的值。 查看源代码 。 如果我在德语区域设置上启动表单,则标签正确地布置在表单的右边缘: 我想要发生的是调用ApplyResources后保留布局。 当然,我可以简单地制作控件的Location和Size属性的副本(如上面提到的相同问题的另一个答案中所建议的),但不幸的是,这些属性的值在区域设置之间是不同的。 因此,在应用本地化字符串和定位之后,如何指导用户控件重新布局其所有控件? 我试过的 通过查看InitializeComponent() ,我尝试调用PerformLayout()到Panel容器,用户控件和表单无济于事。 在调用ApplyResources之前和之后添加SuspendLayout()和ResumeLayout(true) ,也没有成功。 其他实施细节 对实例化用户控件的引用保存在主窗体的私有字典中。 引发该控件的导航时,将删除先前的用户控件,并使用上面的代码段添加现有引用。 对用户更改语言的事件做出反应: protected virtual void OnChangeCulture(CultureInfo newCulture) { System.Threading.Thread.CurrentThread.CurrentCulture = newCulture; System.Threading.Thread.CurrentThread.CurrentUICulture = newCulture; SuspendLayout(); ComponentResourceManager resources = […]

Winforms将Enum绑定到单选按钮

如果我有三个单选按钮,将它们绑定到具有相同选择的枚举的最佳方法是什么? 例如 [] Choice 1 [] Choice 2 [] Choice 3 public enum MyChoices { Choice1, Choice2, Choice3 }

如何保持“form.ShowDialog()”的“this.ShowInTaskBar”同时保持打开状态?

如果您运行此代码片段(将其放在form1中)在一个包含2个表单的全新winform应用程序中 private void Form1_Load(object sender, EventArgs e) { Form2 newForm = new Form2(); Button b = new Button(); newForm.Controls.Add(b); b.Click += new EventHandler(click); this.Show(); newForm.ShowDialog(); } private void click(object sender, EventArgs e) { ((Form)((Control)sender).Parent).ShowInTaskbar = false; } 然后单击新表单上的按钮(应该是form2),form2将关闭。 如何保持开放?

如何获取应用程序特定的数据文件夹(ProgramData)?

我需要读取和写入包含所有用户共享的特定于应用程序的数据的文件。 我尝试使用Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) ,但它只返回C:\ ProgramData 。 我的问题是: 它是否存在像Path.GetDirectoryName(Application.UserAppDataPath)这样的系统,它会根据我的应用程序名称和版本为我提供要写的确切文件夹? 或者ProgramData不是正确的地方。 谢谢。

如何在MessageBox中显示textBox控件?

知道如何在MessageBox中显示textBox控件。 我正在研究winforms projcet c#。 先感谢您。