Tag: winforms

在SqlDataAdapter中防止SQL注入的最佳方法

您好我想知道在SqlDataAdapter防止SQL injection的最佳方法是什么(因为没有办法使用参数化查询)? 例如,让我们使用这部分代码: da_services = new SqlDataAdapter(“SELECT * from table WHERE column='” + textBox1.Text + “‘ AND column2='” + somestring + “‘”, conn); scd_services = new SqlCommandBuilder(da_services); dt_services = new DataTable(); da_services.Fill(dt_services); dtg_services.DataSource = dt_services; conn.Close(); 感谢您的时间。

在Winform上是否存在用于C#ComboBox的BeforeUpdate

我来自VBA世界,并且记得我可以在combobox上进行一次BeforeUpdate调用。 现在我在C#(并喜欢它),我想知道是否在BeforeUpdate上有一个关于ComboBox的BeforeUpdate调用? 我可以创建一个不可见的文本框并存储我需要的信息,并在更新后,查看我需要的那个框,但我希望有一个更简单的解决方案。

如何以毫秒精度在特定时间触发C#函数?

我有2台计算机的时间通过NTP同步,这确保时间只有几毫秒的差异。 其中一台计算机将通过TCP向另一台计算机发送消息,以便在将来的两台计算机上的指定时间启动某个c#function。 我的问题是:如何在特定时间以毫秒精度(或更好)触发C#中的函数? 我需要在程序代码中执行此操作(因此任务计划程序或其他外部程序将无济于事)。 总是在一个单独的线程中循环来比较当前时间和目标时间不是一个很好的解决方案我猜。 更新: DateTime.Now不能在解决方案中使用,因为它具有低分辨率。 似乎Thread.Sleep()可以通过导入强制具有1 ms的分辨率: [DllImport(“winmm.dll”, EntryPoint=”timeBeginPeriod”)] public static extern uint MM_BeginPeriod(uint uMilliseconds); 和使用: MM_BeginPeriod(1); 要恢复到先前的分辨率导入: [DllImport(“winmm.dll”, EntryPoint = “timeEndPeriod”)] public static extern uint MM_EndPeriod(uint uMilliseconds); 并使用: MM_EndPeriod(1); 更新2: 我用很多值测试了Thread.Sleep(),看起来它作为一个平均值会趋向于指定的时间跨度。 仅调用Thread.Sleep()一次通常会在目标值时间范围内保持大约半毫秒左右,因此对于毫秒级分辨率来说非常精确。 使用winmm.dll方法timeBeginPeriod和timeEndPeriod似乎对结果的准确性没有影响。 解: 一种方法是使用timeSetEvent(不建议使用)或CreateTimerQueueTimer。 目前的问题是,两者都需要作为一个参数,剩余的时间直到函数触发而不是它应该触发的时间。 因此必须计算触发器所需时间之前的延迟,但DateTime.Now提供低分辨率。 我找到了一个允许高分辨率获取当前DateTime的类。 所以现在剩下的时间可以用高分辨率计算,并作为参数传递给CreateTimerQueueTimer。

Control.invoke和父控件

可以说我有一个名为MainForm的表单,并对其进行控制:somelabel。 为了从另一个线程访问这些控件,我必须使用Invoke方法。 例如: somelabel.Invoke(…); 但是我也可以通过以下forms访问标签 : MainForm.Invoke(…) //Code for manipulating somelabel 这两个片段在性能或其他技术方面有什么区别吗?

WndProc没有可见的forms?

我想在第二个线程上创建一个表单,它将在它的WndProc方法中接收消息。 建立这样一个不可见forms的推荐方法是什么? 设置“ShowInTaskbar = false”和“Visible = false”是否足够,或者是否有“更清洁”的方式?

没有控制框的Windows窗体对话框图标

我想知道有没有办法在我的自定义对话框的左上角有图标,而控制框,最小化框和最大化框被禁用? 单击图标(关闭,关闭,移动等)时,我不需要任何function。 我只是希望它看起来更漂亮。

如何在使用后台工作时正确处理表单关闭?

我在一些代码中观察到一个奇怪的错误,我怀疑它与关闭表单和后台工作者交互的方式有关。 以下是可能出错的代码: var worker = new BackgroundWorker(); worker.DoWork += (sender, args) => { command(); }; worker.RunWorkerCompleted += (sender, args) => { cleanup(); if (args.Error != null) MessageBox.Show(“…”, “…”, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); }; worker.RunWorkerAsync(); 当按下按钮时,该代码在表单中的方法中执行。 command()很慢,可能需要几秒钟才能运行。 用户按下执行上述代码的按钮以执行。 在完成之前,表单已关闭。 问题是调用cleanup() 有时会引发ObjectDisposedException。 我说“有时”,因为这在我的电脑上永远不会发生。 如果在完成command()之前关闭了表单,则不会执行我为RunWorkerCompleted注册的处理程序。 在另一台计算机上,处理程序一次被调用一次。 在同事的电脑上,它几乎总是被称为。 显然,处理程序的执行概率随着计算机的年龄/速度而增加。 第一个问题: 这是BakgroundWorker的预期行为吗? 我不希望它对forms有任何了解,因为我看不到任何与“工人”相关的forms。 第二个问题: 我该如何解决这个问题呢? 我正在考虑可能的解决方案: 在调用cleanup()之前测试是否(!this.IsDisposed)。 这还不够,还是可以在执行清理时处理表单? 在try {} catch(ObjectDisposedException)中调用cleanup()。 我不太喜欢这种方法,因为我可能会捕获由于cleanup()中的一些其他无关错误或它调用的方法之一而引发的exception。 […]

如何使用c#从Windows应用程序(而不是Web)上的系统托盘创建表单弹出窗口

我在c#中有一个winform应用程序。 主要forms通常是最小化的。 当某些事件发生时,我想创建一个小的弹出窗体,在托盘图标上方显示动画,点击它,将显示主窗体。 为了实现这一点,我只是创建简单的表单? 还是有特殊的系统forms? 例如,有一个弹出消息,用msn messenger警告新邮件。 提前感谢。

Try / Catch没有抓住

在下面的代码中,我故意将“@fooData”错误地输入到“@ foo111Data”以检查try语句是否正在捕获我的exception。 见下面的代码。 但是try / catch语句没有在MessageBox中捕获并显示和exception,而VS2010只是分解并突出显示错误代码行。 try { conn.Open(); cmd.Parameters.AddWithValue(“@foo111Data”, dataStrTb1.Text); cmd.ExecuteNonQuery(); } catch (SqlCeException ex) { MessageBox.Show(ex.ToString()); } finally { conn.Close(); }

WinForms性能之谜:派生的PictureBox控件比原来慢?

在我的.NET 2.0项目中,我创建了一个空的派生类System.Windows.Forms.PictureBox : public class NewPictureBox : PictureBox { //absolutely nothing } 然后我做了以下事情: 将派生控件和基本控件的Image属性设置为相当大的图像(800×600), SizeMode为Normal (仅显示左上角部分); 连接了几个NewPictureBox和PictureBox的事件,因此当在表面上拖动鼠标时可以绘制一个选择框; 设置它以便选择框的属性( Width / Height )将在NumericUpDown控件上实时更新。 问题是当在导出的PB上快速拖动鼠标时,与在基础PB上执行相同操作相比,存在相当大的“不稳定性”。 Width / Height值不会实时更新。 有人知道为什么会这样吗? 如何使用派生控件实现相同的平滑度? 谢谢! 对于任何希望查看最小样本项目并描述所述问题的人: http://www.mediafire.com/?i2nq2tmmjzx