Tag: winforms

在调用`Invoke`时避免`ObjectDisposedException`

我有2个表单,一个是MainForm ,第二个是DebugForm 。 MainForm有一个按钮,可以像这样设置和显示DebugForm,并传递对已经打开的SerialPort的引用: private DebugForm DebugForm; //Field private void menuToolsDebugger_Click(object sender, EventArgs e) { if (DebugForm != null) { DebugForm.BringToFront(); return; } DebugForm = new DebugForm(Connection); DebugForm.Closed += delegate { WindowState = FormWindowState.Normal; DebugForm = null; }; DebugForm.Show(); } 在DebugForm中,我附加了一个方法来处理serialport连接的DataReceived事件(在DebugForm的构造函数中): public DebugForm(SerialPort connection) { InitializeComponent(); Connection = connection; Connection.DataReceived += Connection_DataReceived; } 然后在Connection_DataReceived方法中,我更新DebugForm中的TextBox,即使用Invoke进行更新: private […]

如何在不使用Bitmap.MakeTransparent()的情况下将图像设置为在C#中具有透明背景?

我想将图像设置为具有透明背景,但我不想用透明度替换特定颜色的所有像素。 更具体地说,图像是文件夹的缩略图图像,通过IShellItemImageFactory.GetImage获得。 这给了我一个位图,如Windows资源管理器缩略图视图中所示,但背景为纯白色。 我可以在它上面使用Bitmap.MakeTransparent,这在大多数情况下都适用,但在任何情况下缩略图图像都包含白色(例如,包含图像的文件夹,包括白色)。 很明显,这是十多年来作为开发人员的第一次,在搜索我的问题后,我没有在任何地方找到答案,我实际上不得不自己问一下。 (我认为这意味着我只是升级了!Yippee,我现在是二级开发人员…)

将列表视图中的选定行显示为textBox?

如何将列表视图中的选定行显示到textBox? 这是我如何做int dataGridView: private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) { dataGridView1.Rows[e.RowIndex].ReadOnly = true; if (dataGridView1.SelectedRows.Count != 0) { DataGridViewRow row = this.dataGridView1.SelectedRows[0]; EmpIDtextBox.Text = row.Cells[“EmpID”].Value.ToString(); EmpNametextBox.Text = row.Cells[“EmpName”].Value.ToString(); } } 我试过这个: private void listView1_SelectedIndexChanged(object sender, EventArgs e) { ListViewItem item = listView1.SelectedItems[0]; if (item != null) { EmpIDtextBox.Text = item.SubItems[0].Text; EmpNametextBox.Text = item.SubItems[1].Text; } }

创建Visual Studio样式选项/设置对话框

我目前正在改进winforms应用程序的选项对话框。 目前我正在使用制表符控件。 我想创建一个类似于Visual Studio的设置的表单/对话框。 这是怎么做到的? 我可以在左侧看到类似控件的树视图,但是他们使用什么控件来显示每个选项页面,它似乎不是选项卡控件。 我希望能够在设计时为每个设置构建控件。 谢谢。

MonoState,Singleton或Derived Forms:CRUD应用程序的最佳方法?

我有一个相当大的CRUD WinForm应用程序,有很多对象。 人员,报名,计划,案例注释等 。 应用程序中有超过30种表单,逻辑上分解了UI。 会员,注册,计划,CaseNotes等 。 我试图找出如何在搜索表单上搜索并将该对象传递给下一个请求的表单后如何创建我的Person对象 。 无论那是什么,让我们说人口统计学 。 缺点是我需要Person对象在整个App中可用,并且只能有一个。 现在我有ZERO接触设计模式,但我正在尝试。 我已阅读http://www.switchonthecode.com/tutorials/csharp-tutorial-singleton-pattern和http://www.yoda.arachsys.com/csharp/singleton.html但我想确保我理解正确将此应用于我的情况。 首先,示例说明您正在访问引用 ,对吗? 我错了还是需要访问该值 ? 其次,还有什么我需要做的才能使全球可用吗? 我只是在每个表单上声明一个实例,但通过这个Singleton模式,以便没有多于一个? 谢谢 编辑1 为了澄清,所有对象都是Person的子对象。 此外,正如搜索页面所躲避的那样; 用户可以选择不同的currentPerson。 但他们一次只能与一个人互动。 最后,正如我所说的那样,我是一个婴儿,如果我应该考虑其他事情,请说明一个不同的方法,如果你愿意提供一些解释,为什么,我会非常感激。 编辑2 根据Medicine Man的评论我认为我已经澄清了。 首先,感谢迄今为止贡献的所有人。 其次,我不知道关于设计模式的第一件事,如果在我目前的情况下需要某一个,我当然没有最模糊的。 如果有人有一个更好,更简单,或者,在您看来,更合适的方法将数据对象从FORM传递到FORM到FORM然后请告诉。 最后,我需要一种跟踪信息的方法,因为我的用户从一个地方到另一个地方。 谢谢

C# – System.Windows.Forms.Clipboard.GetDataObject()没有响应

有没有人知道为什么System.Windows.Forms.Clipboard.GetDataObject()在从主线程中调用System.Windows.Forms.Clipboard.Clear()之后从另一个线程调用它并且在主线程停止之前没有返回? 我写了一个示例程序来解释我的问题: public class ClipboardDemo { [STAThread] public static void Main(string[] args) { Thread.CurrentThread.Name = “MAIN_THREAD”; Thread clipboardViewerThread = new Thread(RunClipboardViewer); clipboardViewerThread.Name = “CLIPBOARD_VIEWER_THREAD”; clipboardViewerThread.SetApartmentState(ApartmentState.STA); Thread clipboardClearerThread = new Thread(RunClipboardClearer); clipboardClearerThread.Name = “CLIPBOARD_CLEARER_THREAD”; clipboardClearerThread.SetApartmentState(ApartmentState.STA); Console.WriteLine(“Starting ” + clipboardViewerThread.Name + “, expecting initial WM_DRAWCLIPBOARD message…”); clipboardViewerThread.Start(); Thread.Sleep(1000); Console.WriteLine(“Clearing clipboard from ” + clipboardClearerThread.Name + “, expecting […]

获取已删除的DataGridView行的单元格值

我的datagridview itemDelete函数: this.dgv_items.RowsRemoved += this.dgv_items_itemDelete; private void dgv_items_itemDelete(object sender, DataGridViewRowsRemovedEventArgs e) { try { int row = e.RowIndex; string name = dgv_items.Rows[row].Cells[0].Value.ToString(); deleteFromDB(name); } catch (Exception) { } } 但是当我们到达此代码时,该行将被删除,这意味着dgv_items.Rows[row].Cells[0].Value获取该行的下一行的值。 我想获取已删除行的Cells[0]值,因此我也可以从数据库文件中删除该项目。 我怎样才能做到这一点?

有没有办法显示“阻止”WinForms ContextMenu?

有没有办法显示ContextMenu并阻止进一步执行,直到选择了一个项目? 特别是,我希望获得类似于ShowDialog()行为,但是对于ContextMenu 。 直接的方法不起作用: ContextMenu cm = new ContextMenu(); cm.MenuItems.Add(“1”, (s,e) => {value = 1;}); cm.Show(control, location); 因为Click回调不是直接从Show()调用,而是在消息循环处理click事件时稍后调用。 如果你运气不好, menu会在事件处理之前被垃圾收集,在这种情况下,事件就会无声地丢失。 (这意味着你不能以这种方式真正使用ContextMenu的局部变量。) 这似乎有效,但感觉“不洁”: using (ContextMenu cm = new ContextMenu()) { cm.MenuItems.Add(“1”, (s,e) => {value = 1;}); cm.Show(control, location); Application.DoEvents(); } 有没有更好的办法?

WinForms中的CKEditor Dropdown工具栏未注册单击事件

我目前在C#(Framework 3.5)的WinForms的WebBrowser控件中遇到了CKEditor(版本4.4.0)的问题。 我正在使用UIColor和字体大小/系列选项与编辑器 – 当我在IE中加载页面时工作正常。 通过WebBrowser控件,尝试选择颜色或字体(或右键单击剪切/复制/粘贴菜单)时的单击事件永远不会注册。 我注意到,如果我使用键盘选择选项并按Enter键,一切都按预期工作。 ckeditor方面似乎正在发生的事情是它为控件创建一个div,在该div中加载一个iframe并生成HTML,这样你就可以得到一个很好的,丰富的显示,你会选择哪种字体等等。这已加载,WebBrowser控件无法识别该iframe中新创建的HTML,并将其视为单击时不存在。 即如果我点击颜色并且该颜色下有另一个按钮,其他按钮点击事件就会被注册。 有没有办法告诉Web浏览器控件实际上有什么东西 – 或者强制它读取新渲染的代码? 我注意到,当我点击字体或颜色时,Navigating事件也会被触发,但之后它永远不会进入DocumentCompleted / Navigated例程。 虽然我安装了IE11,但我的WinForms应用程序中的Web浏览器控件在IE 9设置下运行(使用FEATURE_BROWSER_EMULATION = 9000)。 我也尝试过使用FEATURE_BROWSER_EMULATION = 11000,也没有成功。 有什么想法在这里做什么? HTML: Editor Test $(document).ready(function () { $(“#uxBody”).ckeditor(); for (var i in CKEDITOR.instances) { CKEDITOR.instances[i].on(‘change’, function () { pageIsDirty = true; }); } }); Correspondence Subject: *Body: CK编辑器配置文件: CKEDITOR.editorConfig = function (config) { […]

ListBox以彩色插入项目

我使用ListBox插入文本,就像You add Michael in your database一样, You delete Michael ,… listBox1.Items.Insert(0,”You add ” + name + ” in your database\n”); 它工作正常。 如何将颜色设置为黑色(插入)和红色(删除)? 我试过这个: public class MyListBoxItem { public MyListBoxItem(Color c, string m) { ItemColor = c; Message = m; } public Color ItemColor { get; set; } public string Message { get; set; } } […]