Windows forms - odwolanie do konkretnego texboxu lub check box na podstawie zmiennej

0

Witajcie,

Nie wiem czy w ogole jest to mozliwe ale załóżmy, że mam 9 pól w oknie kazdego rodzaju - 9 texboxow i 9 check boxow. I teraz chcialbym zrobić jedną fukncję która na podstawie zmiennej np numeru pola zaktualizuje dokladnie to pole z numerem(na obecną chwilę mam to rozwiązane switchem ale to dużo kodu i mam wrażenie, że da się to zrobić lepiej)

np cos takiego (czysto teoretycznie)

private void update(string value, bool Enabled, int position)
{
this.pole{position}.Text = value;
this.checkbox{position}.Checked = Enabled;
return;
}

2

Nie czuję w czym problem, nie dałes kodu z problematyczny switchem

Z jednej strony rodzic ma property Controls
Z drugiej każdy control ma Tag do różnych fajnych wynalazków, o wiele lepszych niż tylko numer (pełna obiektówka), choć to może być numer.

Mam mocne przekonanie, ze w pełni bym obskoczył coś jak Ty chcesz

1

Var txt = Form.Controls["textBox" + txtNr.ToString()] as TextBox;

Sprawdzić czy nie null.

1

Możesz sobie stworzyć tablicę albo listę checkboxów czy czego tam chcesz i odwoływać się przez indeks…

CheckBox[] tablica = { checkBox0, checkBox1, checkBox2, checkBox3 };
1

A te odpowiadające sobie kontrolki znajdują się w losowych miejscach okna, czy jakoś blisko siebie?
Bo może pasowałoby zrobić jakieś swoje user control z checkboxem i textboxem w środku, które będą ze sobą odpowiednio powiązane, a potem umieścić na formatce kilka takich kontrolek.

0

udalo mi się to rozwiązać przy użyciu opcji find

private bool assignFileNames()
        {
            this.newFileNames[this.currentIndex] = this.indexField1.Text;
            for (int i=2;i<=8;i++)
            {
                CheckBox filename = this.Controls.Find($"fieldnameBox{i}", true).FirstOrDefault() as CheckBox;
                TextBox indexbox = this.Controls.Find($"indexField{i}", true).FirstOrDefault() as TextBox;
                TextBox fieldname = this.Controls.Find($"fieldnameField{i}", true).FirstOrDefault() as TextBox;
                CheckBox require = this.Controls.Find($"requiredBox{i}", true).FirstOrDefault() as CheckBox;
                if(filename.Checked == true)
                {
                    require.Checked = true;
                    if(indexbox.TextLength ==0)
                    {
                        emptyFieldErrorMessage(i, fieldname.Text);
                        return false;
                    }
                    this.newFileNames[this.currentIndex] += "-" + indexbox.Text;
                }
            }
            return true;
        }
2

@maciejsiega:

Z brzydkich, jakie się spodziewałem, to jest szczególnie brzydkie - chyba najbardziej mnie odrzuca wielka pozoracja, że używamy nowoczesnych technik programowania

UPDATE:
Dodam, że zależności i ilości danych o jakie chodzi w finale są inne niż w pytaniu, są dużo większe, wprowadziłeś nas w błąd.
Szycie tego na GUI jest d/d, a traktowanie GUI jako kontenera danych, to woła o pomstę.

Robi się klasę o charakterze Model, która reprezentuje czyste dane, udostępnia np tablicę obiektów jakiejś klasy, które mają propertisy. Potem to się "binduje" do widgetów GUI.
A zależności algorytmiczne pozostają przy Modelu, a nie spagetti na GUI

Sorry za zjebkę, ale używasz większego zakresu języka, więc traktuję Cię jak kogoś, kto kuma

https://docs.microsoft.com/en-us/dotnet/desktop/winforms/windows-forms-data-binding?view=netframeworkdesktop-4.8

0

@AnyKtokolwiek: Ależ ja sie nie gniewam :) Zawsze wychodzę z założenia, że zwróć uwagę głupiemu to się obrazi, a mądry weźmie nauczkę. C# się uczę od ciut ponad 2 tygodni i każda godzina programowania to dla mnie coś nowego. Takie rozwiązania jak to może najlepsze nie są ale kombinowaniem poznaję wiele aspektów tego języka. Dziękuję za link będę studiował dzisiaj :) bo jutro Diablo wychodzi

0

Proponuję zastanowić się, czy nie wystarczy CheckedListBox zamiast luźne checkboxy, ale to kwestia co i jak ma być wyświetlone.

P.S. co chcecie od Delphi?

1 użytkowników online, w tym zalogowanych: 0, gości: 1