我怎样才能在整个项目中重用这个片段?
How can I reuse this snippet throughout a project?
我在我的应用程序中的每个表单上都有此代码,这些表单具有文本框以防止只读的文本框被标记为:
private void FrmInventory_Load(object sender, EventArgs e)
{
foreach (var txtbx in Controls.OfType<TextBox>())
{
txtbx.TabStop = (!txtbx.ReadOnly);
}
}
最好只将此代码放在一个地方,但我该怎么做,因为每次调用 "external" 方法时,它都会触及调用表单上的文本框,闻起来像有点腥。是一种扩展方法,例如:
public static bool TextboxIsReadOnly(this TextBox txtbx)
{
return txtbx.ReadOnly;
}
...然后这样称呼它:
foreach (var txtbx in Controls.OfType<TextBox>())
{
txtbx.TabStop = TextboxIsReadOnly(txtbx);
}
?
这似乎没有多大价值 - 我仍然必须将大部分代码放入每个表单中,就像现在的情况一样。创建一个 ReadOnly 和 TabStop = false 的自定义文本框似乎有点矫枉过正...
有没有办法让每个包含 TextBox 的表单都执行此逻辑,而无需在整个项目中重新生成代码?
拥有一个执行该步骤的基础 class 并使其成为所有表单的基础是可行的,尽管您需要小心调用重载方法的基础版本。
您可以创建一个 baseForm 并在每个表单中继承该表单。
将新的 Windows 表单添加到您的项目 (baseForm) 并创建加载事件
public class baseForm: Form
{
public baseForm()
{
this.Load += baseForm_Load;
}
void baseForm_Load(object sender, EventArgs e)
{
var t = GetAll<TextBoxX>(this);
foreach (var txtbx in Controls.OfType<TextBox>())
{
txtbx.TabStop = (!txtbx.ReadOnly);
}
}
public static List<T> GetAll<T>(Form f1)
{
List<T> f = new List<T>();
try {
if (f1 != null) {
CheckInner<T>(f1.Controls, ref f);
}
} catch (Exception ex) {
f.Clear();
}
return f;
}
}
最后在每个表单中你都可以这样做
public partial class FrmInventory : baseForm
{
}
只是详细说明您所暗示的扩展方法解决方案。
扩展方法
public static partial class MyExtensions
{
public static void UpdateTabStop(this TextBox txtBox)
{
txtBox.TabStop = !(txtBox.ReadOnly);
}
public static void UpdateTabStop(this Form frm)
{
foreach (var txtBox in frm.Controls.OfType<TextBox>())
{
txtBox.UpdateTabStop();
}
}
}
然后,在任何 Form
上你会做 this.UpdateTabStop()
...你当然应该在控件初始化后的事件中这样做,比如 Load
.
我在我的应用程序中的每个表单上都有此代码,这些表单具有文本框以防止只读的文本框被标记为:
private void FrmInventory_Load(object sender, EventArgs e)
{
foreach (var txtbx in Controls.OfType<TextBox>())
{
txtbx.TabStop = (!txtbx.ReadOnly);
}
}
最好只将此代码放在一个地方,但我该怎么做,因为每次调用 "external" 方法时,它都会触及调用表单上的文本框,闻起来像有点腥。是一种扩展方法,例如:
public static bool TextboxIsReadOnly(this TextBox txtbx)
{
return txtbx.ReadOnly;
}
...然后这样称呼它:
foreach (var txtbx in Controls.OfType<TextBox>())
{
txtbx.TabStop = TextboxIsReadOnly(txtbx);
}
?
这似乎没有多大价值 - 我仍然必须将大部分代码放入每个表单中,就像现在的情况一样。创建一个 ReadOnly 和 TabStop = false 的自定义文本框似乎有点矫枉过正...
有没有办法让每个包含 TextBox 的表单都执行此逻辑,而无需在整个项目中重新生成代码?
拥有一个执行该步骤的基础 class 并使其成为所有表单的基础是可行的,尽管您需要小心调用重载方法的基础版本。
您可以创建一个 baseForm 并在每个表单中继承该表单。
将新的 Windows 表单添加到您的项目 (baseForm) 并创建加载事件
public class baseForm: Form
{
public baseForm()
{
this.Load += baseForm_Load;
}
void baseForm_Load(object sender, EventArgs e)
{
var t = GetAll<TextBoxX>(this);
foreach (var txtbx in Controls.OfType<TextBox>())
{
txtbx.TabStop = (!txtbx.ReadOnly);
}
}
public static List<T> GetAll<T>(Form f1)
{
List<T> f = new List<T>();
try {
if (f1 != null) {
CheckInner<T>(f1.Controls, ref f);
}
} catch (Exception ex) {
f.Clear();
}
return f;
}
}
最后在每个表单中你都可以这样做
public partial class FrmInventory : baseForm
{
}
只是详细说明您所暗示的扩展方法解决方案。
扩展方法
public static partial class MyExtensions
{
public static void UpdateTabStop(this TextBox txtBox)
{
txtBox.TabStop = !(txtBox.ReadOnly);
}
public static void UpdateTabStop(this Form frm)
{
foreach (var txtBox in frm.Controls.OfType<TextBox>())
{
txtBox.UpdateTabStop();
}
}
}
然后,在任何 Form
上你会做 this.UpdateTabStop()
...你当然应该在控件初始化后的事件中这样做,比如 Load
.