Tag: winforms

在我的winform应用程序中获取rdlc报告的相对路径

我将在月末流程中自动从一些报告中创建PDF。 我遇到了ReportViewer.LocalReport无法找到我的报告的问题。 在项目中,报告文件位于“(项目根文件夹)/Reports/report.rdlc”中。 如何设置ReportViewer.LocalReport.ReportPath以便我可以引用我的报告文件? 我宁愿不设置完整路径,因为我不知道在客户端计算机上安装它将在何处安装。

为什么添加SuspendLayout和ResumeLayout会降低性能?

我需要向父控件添加很多控件。 但我发现如果在将这些控件添加到父级之前和之后添加ParentControl.SuspendLayout和ParentControl.ResumeLayout ,我会使用秒表来测量滴答:如果我删除代码ParentControl.SuspendLayout和ParentControl.ResumeLayout ,它会更快。 为什么会这样? 所以SuspendLayout和ResumeLayout不应该减少添加子控件的时间,对吗? 那么使用SuspendLayout和ResumeLayout什么好处,换句话说,如果我不使用SuspendLayout和ResumeLayout但是直接将子控件添加到父母,那有什么不好?

透明.NET表单中的抗锯齿文本

我有一个C#应用程序,它以透明的.NET表单显示当前时间。 表格没有控件也没有边框。 其属性TransparencyKey设置为Form的背景颜色“浅灰色”以使其透明。 因此用户只能看到文本(当前时间)。 该文本在PaintEventHandler中绘制: private void Display_Paint( object sender, PaintEventArgs e ) { Graphics formGraphics = e.Graphics; Font myFont = new Font( “Microsoft Sans Serif”, 24, FontStyle.Bold ); formGraphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; //formGraphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixel; formGraphics.DrawString( “00:00:00”, myFont, Brushes.Green, 0.0F, 0.0F ); myFont.Dispose(); } 由于抗锯齿,当表格在黑暗背景下时,文本“00:00:00”显示为磨损。 对于浅色背景,文字没问题 此图显示了问题和好的情况: 文字显示由于深色背景的抗锯齿而产生的条纹http://sofzh.miximages.com/c%23/antiAliasing_bad.png 显然,Windows确实以适合Form自身背景颜色的方式呈现文本,而不是以适合透明表单背后的背景的方式呈现文本。 是否有可能让Windows在渲染文本时考虑到Form背后的背景,以便摆脱边缘? 一个“解决方案”可能是通过相应地设置TextRenderingHint来关闭抗锯齿。 但到目前为止,这不是我首选的“解决方案”。 系统: Windows XP,SP […]

使用C#winform的zeromq pub / sub示例

我正在尝试创建一个C#Winform应用程序,它在pub / sub模型中使用ZeroMQ(通过nuget的clrzmq .net bindings(x86))。 经过多次搜索,我只能找到独立的C#示例,其中代码使用while语句无限期地处理新消息。 当我尝试使用这些示例时,我不知道将代码放在何处,它只会阻止gui和其他所有内容。 我不知道如果不使用另一个线程是不可能做到的,但我的印象是ZeroMQ的异步行为可以在不编写额外线程的情况下工作。 也许我只是不知道在哪里放zeromq代码,或者我真的需要另一个线程。 如果有人可以提供一个简单的pub / sub示例,其中包含将代码实际插入默认C#winform应用程序的方向,我们将非常感激。

区分用户交互引发的事件和我自己的代码

在以下情况下,从combobox中在我的应用程序中触发SelectedIndexChanged事件: 用户在combobox中选择不同的项目,或者在以下情况下: 我自己的代码更新了combobox的SelectedItem以反映combobox现在显示不同对象的属性。 我对case 1的SelectedIndexChanged事件感兴趣,这样我就可以更新当前对象的属性。 但是在第2种情况下,我不希望事件触发,因为对象的属性没有改变。 一个例子可能有帮助。 让我们考虑一下,我有一个包含人员列表的列表框,我有一个combobox,表示列表中当前所选人员的国籍。 如果Fred目前在列表中被选中,则可能发生案例1,并且我使用combobox将他的国籍从英语更改为威尔士语。 如果我在列表中选择苏格兰人Bob,则可能发生案例2。 在这里,我的列表更新事件处理程序代码看到Bob现在被选中,并更新combobox,以便苏格兰语现在是所选项目。 这会导致combobox的SelectedIndexChanged事件被触发以将Bob的国籍设置为苏格兰语,即使它已经是苏格兰语。 如何在不导致SelectedIndexChanged事件触发的情况下更新我的combobox的SelectedItem属性? 一种方法是取消注册事件处理程序,设置SelectedItem ,然后重新注册事件处理程序,但这似乎很乏味且容易出错。 肯定有更好的办法。

.NET Windows Forms设计时间规则

我有一个对象启动一个线程,打开一个文件,并等待来自其他类的输入。 在接收输入时,它将其写入磁盘。 基本上,它是一个线程安全的数据记录类…… 这是奇怪的部分。 当我在设计器(Visual Studio 2008)中打开一个使用该对象的表单时,将创建该文件。 它显然是在设计时vhost进程下运行的…… 奇怪的是我无法在另一个项目中重现这个问题。 我不确定在设计器中执行的代码和没有执行的代码的规则是什么。 例如,在Windows窗体构造函数中创建文件实际上并不是在设计时创建文件… 解释是什么? 有参考吗?

检测PrintDocument何时成功打印(不仅仅是预览)

我在我的应用程序中使用PrintDocument进行一些自定义打印。 我的项目成功打印时需要记录。 我最初通过以下方式实现了这个目标 print_doc.EndPrint += (o,e) => printed_callback (); 打印完成后调用printed_callback 。 但是,现在我正在添加预览支持,我将PrintDocument以完全相同的方式传递到PrintPreviewDialog中 。 这样做会导致在初始呈现预览所需的打印输出后调用EndPrint事件。 因此,即使用户单击“预览”然后关闭预览,也会调用我们的日志记录代码。 有关如何区分真实打印输出和“预览打印”的任何建议? 不幸的是,由于用户可能会单击预览对话框中的“打印”按钮并触发打印输出,因此我不能仅为传递给PrintPreviewDialog的PrintDocument连接到EndPrint 。

如何在combobox中显示枚举值?

如何在combobox中显示枚举值? 下面的代码导致combobox的所有显示名称都是“caseHandler.cState”。 我希望它具有枚举值的实际名称。 我的枚举定义如下: public enum caseState { Active = 1, Finished, Problem } 我有一个定义为这样的类: public class cState { public string _name; public int _id; public cState(int id,string name) { _name = name; _id = id; } } 填充我的combobox的代码: ArrayList AL = new ArrayList(); foreach (string cs in Enum.GetNames(typeof(caseState))) { cState aEnum = new cState((int)Enum.Parse(typeof(caseState),cs),cs); […]

如何确保我的winform应用程序部署覆盖旧版本

我已经从VS2008部署项目为我的项目创建了一个msi安装包。 但我在升级安装时遇到问题,以前安装的版本不会被覆盖。 如何确保先前安装的版本被覆盖?

如何使用计时器等待?

我试图通过使用计时器延迟我的方法中的事件,但我不一定了解如何使用计时器等待。 我将我的计时器设置为2秒,但是当我运行此代码时,最后一次调用运行没有2秒延迟。 Timer timer = new Timer(); timer.Tick += new EventHandler(timer_Tick); // Everytime timer ticks, timer_Tick will be called timer.Interval = (1000) * (2); // Timer will tick evert second timer.Enabled = true; // Enable the timer void timer_Tick(object sender, EventArgs e) { timer.Stop(); } private void button1_Click(object sender, EventArgs e) { label1.Text = “first”; […]