Czy ktoś ma fragment kodu, aby wszystkie formanty (lub nawet wszystkie pola TextBox) w formularzu, który jest tylko do odczytu naraz, bez konieczności ustawiania każdej kontroli do odczytu- tylko indywidualnie?Wszystkie formanty na formularzu tylko do odczytu naraz
Odpowiedz
W Rodzaj:
if (_cached == null)
{
_cached = new List<TextBox>();
foreach(var control in Controls)
{
TextBox textEdit = control as TextBox;
if (textEdit != null)
{
textEdit.ReadOnly = false;
_cached.Add(textEdit);
}
}
}
else
{
foreach(var control in _cached)
{
control .ReadOnly = false;
}
}
dodawania rekursji także (sterujące może być umieszczone w innych elementów sterujących (panele)).
Myślę, że przechowywanie w pamięci podręcznej zwiększa wydajność. Będziesz jednak musiał rozważyć umożliwienie użytkownikowi odświeżenia pamięci podręcznej. Twój kod również nie wykonuje iteracji za pomocą zagnieżdżonych kontrolek (takich jak pola tekstowe umieszczone wewnątrz paneli). Ogólnie rzecz biorąc, jest to dobre rozwiązanie. –
@Alex Essilfie Napisałem: "Dodaj rekurencję również" :), nie ma żadnych wzmianek o tworzeniu dynamicznego kodu, aby zresetować _cache (patrz "w formularzu" no out of Form). Dziękuję Ci. – garik
this.Enabled = false;
zależy od tego co robi naprawdę, to może warto rozważyć wprowadzenie kontroli w centrali i wyłączenie tego.
Powinieneś być w stanie napisać sobie funkcję użyteczną, aby to zrobić. Możesz powtórzyć kontrolę nad formantem formularza, a następnie każde dziecko kontrolne kontroluje rekursywnie. Na przykład:
public static void SetEnableOnAllControls(Control parentControl, bool enable)
{
parentControl.Enabled = enable;
foreach (Control control in parentControl.Controls)
SetEnableOnAllControls(control, enable);
}
[...]
// inside your form:
SetEnableOnAllControls(this, false);
To nie zajmuje się ToolStrip
s, które nie są kontrolami. Możesz napisać osobną, podobną do nich metodę.
Należy zauważyć, że powyższe wyłącza również sam formularz. Jeśli nie chcesz, spróbuj tego:
public static void SetEnableOnAllChildControls(Control parentControl, bool enable)
{
foreach (Control control in parentControl.Controls)
{
control.Enabled = enable;
SetEnableOnAllChildControls(control, enable);
}
}
Jeśli naprawdę oznaczało ReadOnly nieruchomość, która ma znaczenie tylko dla tekstowych, spróbuj tego:
public static void SetReadOnlyOnAllControls(Control parentControl, bool readOnly)
{
if (parentControl is TextBoxBase)
((TextBoxBase) parentControl).ReadOnly = readOnly;
foreach (Control control in parentControl.Controls)
SetReadOnlyOnAllControls(control, readOnly);
}
I haven” t testowane, ale to powinno działać:
foreach (var textBox in this.Controls.OfType<TextBox>())
textBox.ReadOnly = true;
Edit: to nie jest tak dobrym rozwiązaniem wydaje: patrz komentarz Timwi użytkownika.
Najbardziej poprawne. Ale wymaga .NET 3.5 – abatishchev
① Nie uwzględnia zagnieżdżonych elementów sterujących, tzn. Działa tylko na elementach sterujących najwyższego poziomu; ② Powinien używać 'TextBoxBase', aby wpływał także na inne kontrolki tekstowe (np.' RichTextBox'). – Timwi
Dobre punkty Timwi, dziękuję. – Nobody
Napisz metodę rozszerzenia, które ma żadnych elementów sterujących i formantów podrzędnych z określonego typu:
public static IEnumerable<T> GetChildControls<T>(this Control control) where T : Control
{
var children = control.Controls.OfType<T>();
return children.SelectMany(c => GetChildControls<T>(c)).Concat(children);
}
zbierać tekstowych na formularzu (wykorzystać TextBoxBase
wpłynąć RichTextBox
, etc - @ rozwiązania Timwi za):
IEnumerable<TextBoxBase> textBoxes = this.GetChildControls<TextBoxBase>();
Powtórz iterację i ustaw tylko do odczytu:
private void AreTextBoxesReadOnly(IEnumerable<TextBoxBase> textBoxes, bool value)
{
foreach (TextBoxBase tb in textBoxes) tb.ReadOnly = value;
}
Jeśli chcesz - użyj buforowania - @ igor's solution
+1 To wydaje mi się najbardziej odpowiednie rozwiązanie. – Niki
Chciałbym użyć refleksji, aby sprawdzić, czy ogólny obiekt Control ma właściwość Enabled.
private static void DisableControl(Control control)
{
PropertyInfo enProp = control.GetType().GetProperty("Enabled");
if (enProp != null)
{
enProp.SetValue(control, false, null);
}
foreach (Control ctrl in control.Controls)
{
DisableControl(ctrl);
}
}
właśnie opracowali rozwiązanie, które obsługuje rekurencyjną jakiejkolwiek kontroli sieci, wykorzystując prostą metodę statyczną i ASP.NET polymorphysm.
Zostało to przetestowane i wygląda dość szybko (mniej niż milisekundę w formularzu sieciowym z wyłączonymi ponad 25 kontrolkami).
Jeśli wolisz metodę rozszerzenia, myślę, że to powinno wystarczyć, aby zmienić rozwiązanie następująco:
public static void DisableControls(this Control control, bool enable = false)
{
foreach (Control ctrl in control.Controls)
{
var wCtrl = ctrl as WebControl;
if (wCtrl != null)
{
wCtrl.Enabled = enable;
}
if (ctrl.Controls.Count > 0)
ctrl.DisableControls(enable);
}
}
public static void EnableControls(this Control control)
{
control.DisableControls(true);
}
- 1. Obsługa a Kliknij wszystkie formanty w formularzu
- 2. Pole tylko do odczytu w formularzu Django
- 3. Znajdź wszystkie formanty w formularzu przy użyciu jQuery lub javascript
- 4. Jak wyłączyć wszystkie formanty w formularzu za wyjątkiem przycisku?
- 5. Kanał "tylko do odczytu" tylko do odczytu
- 6. Jak wyrównać etykiety i tylko do odczytu pola w formularzu
- 7. Jak mogę dopasować formanty w zmienionym formularzu?
- 8. Właściwości tylko do odczytu
- 9. Wyłącz wszystkie formanty w formie maszynopisu
- 10. Tabela jest „tylko do odczytu”
- 11. Lista ciągów tylko do odczytu
- 12. Edycja widoku tylko do odczytu
- 13. Otwórz plik tylko do odczytu
- 14. Tylko do odczytu obserwowalna kolekcja
- 15. Edytor MVC3 Tylko do odczytu
- 16. Komórki DataGridView tylko do odczytu
- 17. SQLite/PHP tylko do odczytu?
- 18. Usuń wszystkie przechowywane procedury naraz
- 19. Właściwość tylko do odczytu OData
- 20. CoreOS: tylko do odczytu systemu
- 21. tylko do odczytu atrybutów przełącz
- 22. Silverlight: Znajdź wszystkie formanty typu w layoucie
- 23. Zwiń wszystkie sekcje kodów XAML naraz
- 24. Dlaczego podział okna wymusza tylko do odczytu?
- 25. Jak odbarwiać wszystkie elementy tablicy naraz?
- 26. Zastępowanie abstrakcyjnej właściwości tylko do odczytu dla odczytu/zapisu Właściwość
- 27. Jak zwrócić tylko do odczytu kopię kolekcji
- 28. Zastępuje właściwość tylko do odczytu z kolumną tylko do odczytu, która ma tę samą wartość.
- 29. Serializacja WCF DataContract właściwości tylko do odczytu?
- 30. Jak włączyć WSZYSTKIE kontrole w formularzu?
@Raulp Nie sądzę „która jest” tutaj jest prawidłowa. Formularz nie jest przeznaczony tylko do odczytu, ale kontrole powinny być. – Breeze