Konwersja za pomocą przycisku w ASP.NET

Witam, nie wiem już jak to napisać. Próbowałem w try catch i swich case ale mi nie wychodzi. Mam program, który konwertuje z dziesiętnego systemu na 3 inne systemy używając TextBox i przycisku Button.

Każdy if else działa ale gdy zakomentuję inne. Mogę z dec na bin ale odwrotnie już nie. jak mogę to połączyć aby działało? O to Kod:

protected void Button1_Click(object sender, EventArgs e)

        {

            if ((TextBox1.Text =="0") && (TextBox2.Text =="0") && (TextBox3.Text =="0") && (TextBox4.Text =="0"))

            {

                Label6.Text = "Wykonaj konwersję!";

                TextBox1.Enabled = false;

                TextBox2.Enabled = false;

                TextBox3.Enabled = false;

                TextBox4.Enabled = false;

            }

           //################# Blok konwersji w jedną stronę ######################

            try

            {

                int bin, hex, oct;

                    bin = int.Parse(TextBox1.Text);

                    TextBox4.Text = Convert.ToString(bin, 2);

                    hex = int.Parse(TextBox1.Text);

                    TextBox2.Text = Convert.ToString(hex, 16);

                    oct = int.Parse(TextBox1.Text);

                    TextBox3.Text = Convert.ToString(oct, 8);


            }

            catch (Exception)

            {


            }


            int bin, hex, oct;

            if (TextBox1.Text == "")

            {

                TextBox4.Text = "0";

                TextBox3.Text = "0";

                TextBox2.Text = "0";

                TextBox1.Text = "0";



            }

            else

            {

                bin = int.Parse(TextBox1.Text);

                TextBox4.Text = Convert.ToString(bin, 2);

                hex = int.Parse(TextBox1.Text);

                TextBox2.Text = Convert.ToString(hex, 16);

                oct = int.Parse(TextBox1.Text);

                TextBox3.Text = Convert.ToString(oct, 8);


            }


             //z bin na inne systemy

            string binhex, bindec, binoct;


            if (TextBox4.Text == "")

            {

                TextBox4.Text = "0";

                TextBox3.Text = "0";

                TextBox2.Text = "0";

                TextBox1.Text = "0";


            }

            else 

            {

                bindec = string.Copy(TextBox4.Text);

                TextBox1.Text = Convert.ToInt32(bindec, 2).ToString();

                binhex = string.Copy(TextBox4.Text);

                TextBox2.Text = Convert.ToString(Convert.ToInt32(TextBox4.Text, 2), 16);

                binoct = string.Copy(TextBox4.Text);

                TextBox3.Text = Convert.ToString(Convert.ToInt32(TextBox4.Text, 2), 8);

            }


            // z octal na inne systemy

            string octdec, octhex, octbin;


            if (TextBox3.Text == "")

            {


                TextBox3.Text = "0";

                TextBox4.Text = "0";

                TextBox2.Text = "0";

                TextBox1.Text = "0";


            }

            else

            {

                octdec = string.Copy(TextBox3.Text);

                TextBox1.Text = System.Convert.ToString(Convert.ToInt32(TextBox3.Text, 8), 10);

                octhex = string.Copy(TextBox3.Text);

                TextBox2.Text = System.Convert.ToString(Convert.ToInt32(TextBox3.Text, 8), 16);

                octbin = string.Copy(TextBox3.Text);

                TextBox4.Text = System.Convert.ToString(Convert.ToInt32(TextBox3.Text, 8), 2);

            }


            // z hex na inne systemy

            string hexdec, hexoct, hexbin;


            if (TextBox2.Text == "")

            {

                TextBox2.Text = "0";

                TextBox3.Text = "0";

                TextBox4.Text = "0";

                TextBox1.Text = "0";


            }

            else

            {

                hexdec = string.Copy(TextBox2.Text);

                TextBox1.Text = System.Convert.ToString(Convert.ToInt32(TextBox2.Text, 16), 10);

                hexoct = string.Copy(TextBox2.Text);

                TextBox3.Text = System.Convert.ToString(Convert.ToInt32(TextBox2.Text, 16), 8);

                hexbin = string.Copy(TextBox2.Text);

                TextBox4.Text = System.Convert.ToString(Convert.ToInt32(TextBox2.Text, 16), 2);

            }




        }

Ogólnie, to przekombinowałeś kod. Musisz zrobić założenie, w jakiej kolejności wykonujesz konwersję(w sensie - jeśli użytkownik wypełnił dwa pola, to które ma pierwszeństwo). W kodzie, który przedstawiłeś, wykonujesz po kolei konwersje z dec na inne(nadpisując wpisane wartości), hex na inne itd.

Załóżmy, że ta kolejność jest następująca: dec->hex->oct->bin. Mając takie założenie możesz kod przedstawić w dość prostej formie:

  • [*:2q76wtn3]jeśli dec nie jest puste*, to val = Convert.ToInt32(dec.Text, 10)**, inaczej jeśli hex nie jest puste, to val = Convert.ToInt32(hex.Text, 16), i analogicznie dla oct i bin.

Nie trzeba tworzyć masy warunków dla każdego pola(najwyżej tekst zostanie nadpisany takim samym tekstem), DRY się kłania :wink:

* - zaleca się używać string.IsNullOrEmpty zamiast porównania z “”(to pierwsze powinno być szybsze - sprawdza tylko czy referencja jest == 0 lub czy Length == 0).

** - można użyć int.Parse, ale przy innych podstawach jest dużo “boilerplate code”

*** - można użyć val.ToString z odpowiednim formatem

Ja piszę program zgodnie z założeniami zadania. Wszystkie cztery pola mają 0. Gdy są puste jest komunikat o wykonaniu konwersji, to mam zrobione. Musze napisać konwersję + po każdej konwersji ma być blokowany przycisk, czyli button1.Enabled = false;

Napisałeś val, mam rozumieć, że to zmienna string czy int?

Z tego co napisałeś to w swich case ma tak być:

swich(wybor)

case 1:

dec.Text = Convert.ToString(Convert.ToInt32(TextBox4.Text, 10), 2) // konwersja z dec to bin

break;

case2:

hex.Text = Convert.ToString(Convert.ToInt32(TextBox4.Text, 16), 10) // konwersja z dec to bin

itd? Tylko jest ale, będzie konwersja z dec na bin lub hex na 10 ale nie na oct . A chodzi mi że jak wybiorę dowolne pole i wpisze liczbę, to przekonwertuje mi na te pozostałe 3 pola.

Nie przedstawiłeś zadania, więc założyłem(albo inaczej - wywnioskowałem z kodu i opisu), że nie jest jakoś skomplikowane i użytkownik podaje jedną liczbę o danej podstawie i jest ona zamieniana na inne podstawy. Schody pojawiają się, gdy poda dwie(lub więcej) liczby i chce je zamienić na inne podstawy, dlatego wprowadziłem “kolejność konwersji” - jeśli ma być możliwość konwersji “wszystko na wszystko”, wtedy nie wystarczą cztery textboxy(zakładając, że wszystko ma się wykonać server-side i jest tylko jedna odpowiedź z serwera) - trzeba to inaczej zorganizować, ale wydaje mi się, że nie to jest problemem.

Wprowadzając zmienną “val”(której typ można wywnioskować po wartości zwracanej z Convert.ToInt32…) pokazałem jak uprościć zadanie - najpierw parsujesz wartość podaną przez użytkownika(z JEDNEGO pola tekstowego, “kolejność konwersji” się kłania) do WSPÓLNEJ podstawy(tutaj: string->zmienna liczbowa typu int, jej “zapis” nas nie obchodzi, bo i tak komputer się tym zajmuje, a dla nas ważna jest jej wartość) a potem tą SPARSOWANĄ WARTOŚĆ przedstawiasz za pomocą innych podstaw(dla uproszczenia kodu można nadpisać też wartość, z której się parsowało - i tak będzie taka sama).

Wiesz, zabij mnie jak możesz, ale już nie wiem co i jak i czemu ma być więcej niż 4 textBoxy? Może podaj przykład konwersji z dec na bin i na odwrót? Bo ja na serio już nie kumam. Najwyżej oddam zadanie i mniej punktów dostanę.

4 pola tekstowe wystarczą, jeśli chcesz przeprowadzać konwersję z TYLKO JEDNEJ PODSTAWY na inne(bo wynikowo dostaniemy 4 różne ciągi znaków). Np. użytkownik podaje dec, konwersja na hex, oct i bin, użytkownik podaje hex, konwersja na dec, oct, bin itp.

Jeśli użytkownik poda dwie wartości, na przykład dec i hex, i będą różne, to którąś trzeba pominąć(i problem upraszcza się do przypadku 1) ALBO konwertować każdą oddzielnie - trzeba te “skonwertowane wartości” gdzieś wyświetlić - każdą można przedstawić w 4 podstawach, a takie wartości są dwie, czyli w sumie potrzeba by było 8 pól tekstowych, by to wszystko pomieścić. Dlatego wprowadziłem “kolejność konwersji” i założyłem, że obsługujemy tylko pierwszy wariant.

Nie trzeba przeprowadzać konwersji dec->bin i na odwrót - wystarczy przeprowadzić konwersję z JEDNEJ podstawy na “wartość wewnętrzną”(czyli inta) i tego inta potem wyświetlić jako liczby o różnych podstawach. Dzięki temu kod jest o wiele prostszy.

Przy założeniu, że obchodzą nas tylko wartości dec, bin i hex, to będzie wyglądać tak:

int value = 0;string.IsNullOrEmpty(TextBox1.Text)) //Dec - nasza wartość, jeśli jest to olewamy resztę pól    value = Convert.ToInt32(TextBox1.Text, 10);else if(!string.IsNullOrEmpty(TextBox2.Text)) //Analogicznie dla hex    value = Convert.ToInt32(TextBox2.Text, 16);else if(!string.IsNullOrEmpty(TextBox3.Text)) //Analogicznie dla bin    value = Convert.ToInt32(TextBox3.Text, 2);

Chodzi mi o te dwa pierwsze wersy co napisałeś:) czyli wprowadzam liczbę w dowolne pole z czterech pól i uzyskuję wynik w kolejnych polach.

Dodane 04.05.2013 (So) 21:11

Przetestowałem i jest ok, ale w drugą stronę nie konwertuje :frowning: jak wpiszę w pole textBox4 11111 to textBox4 zamienia mi na 0.

Nie wiem już, czego nie rozumiesz. Ostatnia próba(:P): jeśli użytkownik przed wciśnięciem “przycisku” uzupełni dwa pola tekstowe(dajmy na to pierwsze i drugie; z liczbą w systemie dziesiętnym i szesnastkowym), czyli chce zamienić podstawy DWÓCH liczb, to niestety - musisz jedną odrzucić i ograniczyć się do zamiany TYLKO JEDNEJ liczby, bo nie masz gdzie wyświetlić drugiej.

Jeśli przekopiowałeś kod, to nie ma prawa działać - specjalnie pominąłem obsługę czwartej podstawy, byś załapał “o co chodzi”. Hint: przy konwersji nie ustawiasz wartości textBox4 na poprawną.

Fiołek, wiem, że nie masz cierpliwości tłumaczenia aż do skutku, skoro to twoja ostatnia próba wytłumaczenia. Doceniam, że specjalnie musiałeś napisać program, ale nie rozumiem jednego. A napisałem że jak, wpiszę w TextBox1 liczbę dziesiętną to w textBox4 musi być binarnie i jest., ale na odwrót nie działa. wpisuje 1111 to mam 0, jak w TextBox2 wpisuje liczbę hex, to zamienia mi w tym polu zamiast przekonwertować na dec, oct i bin.

O to mi chodzi.

Na koniec, tak przekopiowałem , to co napisałeś aby sprawdzić jak działa.

Nie tyle nie mam cierpliwości tłumaczyć “aż do skutku”(choć raczej na nauczyciela się nie nadaję :wink: ), co nie bardzo wiem z czym masz problem, dlatego to była ostatnia próba(bo kilka postów opisuje to samo, a nie wiem, czy dobrze).

Takie pytanie testowe - zmieniasz gdzieś wartość pól tekstowych? Chodzi mi o wszystkie możliwe miejsca. Nie masz gdzieś przypisania TextBox.Text = “0”(albo domyślnej wartości po stronie HTML)?

Tak w polach input mam zera, tak jest w zadaniu, że na starcie są zera. Opracowałem walidację, gdy naciśnie user przycisk, wyskoczy informacja, że nie dokonałem konwersji.

Eh… Sprawdź warunki w moim kodzie - ciąg znaków “0” nie jest ciągiem pustym, dlatego już “za pierwszym podejściem” value zostaje ustawione(na 0) i reszta zostanie nadpisana. Wystarczy zmienić warunki(na TextBox.Text != “0”) i będzie działać tak jak chcesz.

Ok :slight_smile: Działa:) Wielkie dzięki a ja z ASP.NET jestem słaby, co dopiero zacząłem.