Ich habe ein Windows-Formular. Wenn der Benutzer kein Kontrollkästchen auswählt, wird ein neues Formular später geöffnet, wenn er als nächstes drückt, aber wenn er es auswählt, wird dasselbe Formular verwendet.
Ich möchte, dass ein Klon des aktuellen Formulars angezeigt wird (mit den gleichen Variablen und Steuerwerten), wenn sie das Kontrollkästchen aktivieren, damit sie Werte später ändern können, ohne das Kontrollkästchen abzuwählen, und erneut drücken und die anderen Werte eingeben manuell.
Form duplicate = this;
bezieht sich nur auf die gleiche Form und es gibt keine solche Sache wie new(this)
.
Ich konnte Form duplicate = new Form() = this
nicht versuchen, da mein Formular Konstruktoren von einem früheren Formular
Wer weiß, wie man das macht? Vielen Dank im VorausKopieren Sie den Status von Steuerelementen und Variablen von einem Formular in ein anderes in C#
Antwort
Sie können diese Methode in Ihrem Formular hinzuzufügen:
public void RestoreState(Dictionary<string, object> controlStates,
Dictionary<string, object> membersStates)
{
InternalRestoreControls(controlStates);
InternalRestoreMembers(membersStates);
}
private void InternalRestoreControls(Dictionary<string, object> states)
{
foreach (var state in states)
{
Control c = this.Controls.Find(state.Key, true).FirstOrDefault();
if (c is TextBox)
{
(c as TextBox).Text = state.Value == null ? null : state.Value.ToString();
}
else if (c is CheckBox)
{
(c as CheckBox).Checked = Convert.ToBoolean(state.Value);
}
}
}
private void InternalRestoreMembers(Dictionary<string, object> membersStates)
{
// you might need to tweek this a little bit based on public/instance/static/private
// but this is not the point of your question
BindingFlags flags = BindingFlags.Instance | BindingFlags.Static
| BindingFlags.Public | BindingFlags.NonPublic;
var props = this.GetType().GetProperties(flags);
var fields = this.GetType().GetFields(flags);
foreach(var variable in membersStates)
{
var prop = props.FirstOrDefault(x => x.Name == variable.Key);
if(prop != null)
{
prop.SetValue(this, variable.Value);
continue;
}
var field = fields.FirstOrDefault(x => x.Name == variable.Key);
if(field != null)
{
field.SetValue(this, variable.Value);
continue;
}
}
}
private Dictionary<string, object> GetControlsState()
{
return new Dictionary<string, object>()
{
{ txtBox1.Name, txtBox1.Text },
// continue to the rest
};
}
private Dictionary<string, object> GetMembersState()
{
return new Dictionary<string, object>()
{
{ nameof(variable1), variable1 },
// continue to the rest
};
}
U sage:
Form duplicate = new Form();
duplicate.RestoreState(this.GetControlsState(), this.GetMembersState());
Hier ist, was ich tun würde: Lassen Sie uns so tun, als ob Sie den "Klon" mit einem Knopf öffnen möchten. In Form klonen:
public Form1()
{
InitializeComponent();
}
public Form1(string YourValue, int AnotherValue) //This basically works like a constructor when the form is called
{
InitializeComponent();
ValueLabel1.Text = YourValue;
ValueLabel2.Text = Convert.ToString(AnotherValue);
}
private void DuplicateButton_Click(object sender, EventArgs e)
{
int a = 3;
Form1 Window = new Form1(TextBox1.Text, a);
Window.Show;
}
Ich hoffe, dies für Sie
Es gibt 15 Textfelder, und ich habe bereits Konstruktoren für einen anderen Zweck –
Es ist ein bisschen komplizierter, aber Sie könnten ein Objekt mit den Eigenschaften 'TextBox1'' TextBox2' etc und gib ihnen den Wert. Danach speichern Sie es als XML und wenn Sie das Formular erneut mit Show aufrufen, laden Sie die XML-Datei und weisen die Werte jeder Ihrer TextBoxen zu. – Shmosi
arbeitet Sie ein Wörterbuch mit Steuer Namen als Schlüssel und Steuerwert als Wert und als optionaler Parameter
public form1(string para1, int para2, Dictionary<string,object>yourDic=null)
{
}
passieren können
Sollte ich das Wörterbuch manuell erstellen –
Ja speichern Sie Ihre Steuerelementnamen und Werte wie Text oder bool's im Wörterbuch.Wenn Sie das Formular laden, können Sie überprüfen, ob das Wörterbuch null ist. Und wenn es nicht null ist, könnten Sie Ihre Steuerelemente mit diesen Werten füllen . – Johannes
Haben Sie viele Zustandsvariablen, die Sie klonen müssen? Das Klonen der gesamten Formularhierarchie (Steuerelemente und Kinder und Ereignisse auf dem ganzen Weg) scheint ein großes Durcheinander für mich zu sein, und ich rate dir, dies nicht zu tun. Wenn Sie 5 - 10 Steuerelemente haben, mit denen Sie den Status klonen möchten, halten Sie sich besser an eine Methode, die das für diese spezifischen Steuerelemente übernimmt. – user3185569
Welche Methode steuert Klone mit ihren Werten (ich will nur die '.text' Werte kopiert) –
Und Checked für' CheckBox' zum Beispiel? – user3185569