Я предлагаю иметь TextBox
es, а не Label
s, чтобы содержать любой текст, который можно редактировать. Таким образом, мы имеем TextBox
в 2 различных режимах Режим метки (без редактирования) и Режим TextBox . Для переключения между ними (при условии WinForms ):
// Make TextBox to look like a label: readonly, color, border etc.
private static void ToLabelMode(TextBox box) {
if (null == box)
return;
box.HideSelection = true;
box.BackColor = SystemColors.Control;
box.ReadOnly = true;
box.BorderStyle = BorderStyle.None;
}
private static void ToTextBoxMode(TextBox box) {
if (null == box)
return;
box.HideSelection = false;
box.BackColor = SystemColors.Window;
box.ReadOnly = false;
box.BorderStyle = BorderStyle.Fixed3D;
}
Тогда вы можете использовать их:
TextBox[] m_TextBoxes;
private void MyForm_Load(object sender, EventArgs e) {
m_TextBoxes = new TextBox[] {
textBoxFirstName,
textBoxLastName,
//TODO: Put the relevant ones
};
// Let all TextBox be in Label mode
EnableEdit(false);
}
private void EnableEdit(bool enabled) {
foreach (var box in m_TextBoxes)
if (enabled)
ToTextBoxMode(box);
else
ToLabelMode(box);
}
Редактировать: Если вы настаивать при наличии Label
и TextBox
Я предлагаю иметь оба из них и использовать Visible
, чтобы показать правильный элемент управления (либо Label
, либо соответствующий TextBox
):
Dictionary<Label, TextBox> m_TextBoxesPairs;
private void MyForm_Load(object sender, EventArgs e) {
m_TextBoxesPairs = new Label[] {
labelFirstName,
labelSecondName,
//TODO: put all the relevant labels here
}
.ToDictionary(lbl => lbl,
lbl => new TextBox() {
Parent = lbl.Parent,
Text = lbl.Text,
Location = lbl.Location,
Size = lbl.Size,
Visible = false
});
// If you want to modify Label.Text on TextBox.Text changing
foreach (var pair in m_TextBoxesPairs)
pair.Value.TextChanged += (o, ee) => {pair.Key.Text = pair.Value.Text;}
EnableEdit(false);
}
private void EnableEdit(bool enabled) {
foreach (var pair in m_TextBoxesPairs) {
pair.Key.Visible = !enabled;
pair.Key.Visible = enabled;
}
}