- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在制作一个扩展方法库以在 Windows 窗体应用程序中使用。我打算创建的方法之一将使在输入控件上设置错误状态更容易,例如
public static void SetError(this System.Windows.Forms.TextBox textBox, string errorMessage)
{
if (string.IsNullOrEmpty(errorMessage))
{
//reset control state
textBox.BackColor = System.Drawing.SystemColors.WindowText;
}
else
{
//set background colour to a nice shade of red
textBox.BackColor = System.Drawing.Color.MistyRose;
}
//try to locate an ErrorProvider on the control's containing form.
var errorProvider = LocateErrorProvider(textBox);
if (errorProvider != null)
{
//set error message on error provider (or clear it)
errorProvider.SetError(textBox, errorMessage);
}
}
我正在尝试找出 LocateErrorProvider
方法。我想做的是检查我的表单上是否存在 ErrorProvider,然后仅在存在时才使用它。
ErrorProvider 是一个 Component
而不是 Control
,所以我无法通过 form.Controls
属性访问它。我曾尝试将父表单转换为各种对象,但无济于事。
更新:我已经使用以下代码通过反射成功访问了 ErrorProvider:
private static System.Windows.Forms.ErrorProvider GetErrorProvider(System.Windows.Forms.Control control)
{
//get the containing form of the control
var form = control.GetContainerControl();
//use reflection to get to "components" field
var componentField = form.GetType().GetField("components", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
if (componentField != null)
{
//get the component collection from field
var components = componentField.GetValue(form);
//locate the ErrorProvider within the collection
return (components as System.ComponentModel.IContainer).Components.OfType<System.Windows.Forms.ErrorProvider>().FirstOrDefault();
}
else
{
return null;
}
}
就个人而言,我不太喜欢使用硬编码的字段名称来访问该字段。但在这种情况下,它似乎工作得很好。有人有更好的方法来达到相同的结果吗?
最佳答案
到目前为止,这似乎解决了我的问题:
private static System.Windows.Forms.ErrorProvider GetErrorProvider(System.Windows.Forms.Control control)
{
//get the containing form of the control
var form = control.GetContainerControl();
//use reflection to get to "components" field
var componentField = form.GetType().GetField("components", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
if (componentField != null)
{
//get the component collection from field
var components = componentField.GetValue(form);
//locate the ErrorProvider within the collection
return (components as System.ComponentModel.IContainer).Components.OfType<System.Windows.Forms.ErrorProvider>().FirstOrDefault();
}
else
{
return null;
}
}
感谢 Hans & Cody 的绝妙想法。
关于c# - 在运行时定位 Windows 窗体上的 ErrorProvider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8817359/
对于一个科学实验,我写了一个turtle.py ,它会打开一个 800x480 的窗口并绘制一个缓慢增长的黑点。 turtle.py以 C:\Users\kaza>python C:\Users\ka
我开发了一个 swing 应用程序,但每次运行应用程序时都会打开一个新窗口。我希望如果一个窗口已经打开,则其他窗口不允许打开。 最佳答案 Here是一个 Java 单一应用实例的例子: A singl
有没有办法检测主进程中 Electron 的结构? process.platform 似乎也在 x64 机器上返回 win32,我没有在文档中找到任何获取架构的选项。 最佳答案 你试过 process
public short[] HanningWindow(short[] signal_in ,int pos ,int size) { for (int i= pos; i < pos+si
我有一个具有这些属性的 Electron 窗口: mainWindow = new BrowserWindow({ width: 800, height: 600, title: "Aqu
我有一个 Ubuntu 工作站,我正在尝试引导一个 Windows 节点。 Windows 节点在端口 2222 上打开了 ssh。我一直在关注 http://docs.opscode.com/plu
我是一名优秀的程序员,十分优秀!