C# количество ярлыков или текстовых полей в выигрышной форме - PullRequest
0 голосов
/ 28 февраля 2020

Как я могу получить количество меток в winform динамически? Потому что в моей форме около 12 ярлыков, и если я нажимаю кнопку, я хочу изменить каждый ярлык на текстовое поле. Итак, в итоге я хочу сделать каждый ярлык редактируемым, а после редактирования и сохранить изменить его обратно на ярлык. В итоге это будет похоже на редактируемый ярлык. Но для написания изменений для каждой метки требуется много времени и строк в коде, поэтому, если это возможно сделать динамически c, я буду идеален. Спасибо. This is an example

Ответы [ 2 ]

0 голосов
/ 28 февраля 2020

Попробуйте следующее:

            Control[] labels = this.Controls.Cast<Control>().Where(x => x.GetType() == typeof(Label)).ToArray() ;
            for(int i = labels.Length - 1; i >= 0; i--)
            {
                Label label = (Label)labels[i];
                TextBox newBox = new TextBox();
                newBox.Left = label.Left;
                newBox.Top = label.Top;
                newBox.Width = label.Width;
                newBox.Height = label.Height + 10;
                newBox.Text = label.Text;
                label.Parent.Controls.Add(newBox);
                label.Parent.Controls.Remove(label);
            }
0 голосов
/ 28 февраля 2020

Я предлагаю иметь 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;
    } 
}
...