Konwersja za pomocą przycisku w ASP.NET


(hatezit) #1

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);

            }




        }

(Fiołek) #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


(hatezit) #3

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.


(Fiołek) #4

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).


(hatezit) #5

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ę.


(Fiołek) #6

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);

(hatezit) #7

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.


(Fiołek) #8

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ą.


(hatezit) #9

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.


(Fiołek) #10

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)?


(hatezit) #11

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.


(Fiołek) #12

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.


(hatezit) #13

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