Elektroda.pl
Elektroda.pl
X
CControls
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

ASP.NET C# - Dodawanie zmiennej do gridview

kafus6 21 Sie 2014 21:33 1452 13
  • #1 21 Sie 2014 21:33
    kafus6
    Poziom 14  

    Witam ponownie.

    Mam zapytanie do was odnośnie automatycznego dodawania zmiennej do danej komórki w gridview.

    Załóżmy, że mam zmienną 'zmienna', która oczywiście będzie się zmieniać w zależności od różnych czynników ( akurat jest to nie istotne).

    I teraz chciałbym, aby ta zmienna 'wklejała się' do gridview przy edycji jakiegoś wiersza (kolumna= LastModified).
    Chcę to zrobić jak najprościej, tak wiec wpadłem na pomysł(oczywiscie pomysł, który nie działa :))

    w asp utworzyłem sobie

    Kod: asp
    Zaloguj się, aby zobaczyć kod


    przy UpdateCommand dodałem [LastModified] = 'ModfiedValue'
    w c# w Page_Load dodałem (tylko po to, aby zobaczyć czy działa)
    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    No i jak nie trudno się domyślić wywala błąd:

    Conversion failed when converting the varchar value 'WhoLastModifiedValue' to data type int.

    Wiem, że chodzi o typ danych, ale nie umiem go zmienić. Jak zmieniam string zmienna na int to kompilator krzyczy, że przecież ModfiedValue.Value to string!.

    0 13
  • CControls
  • #2 21 Sie 2014 21:59
    wiesniak
    Poziom 31  

    Dodaj dodatkowe pole/kolumnę w swoim źródle danych i ładuj tę wartość. Dodaj nazwę tego pola/kolumny do DataKeyNames, dzięki czemu wartość będzie dostępna przez właściwość DataKeys. Zakładam, że ta wartość ma być niewidoczna - wtedy nic więcej robić nie musisz.
    Jeśli masz autogenerację kolumn, to po zbindowaniu danych jeszcze tę nową kolumnę będziesz musiał ukryć, bo sama się doda na podstawie nowego pola.

    0
  • CControls
  • #3 22 Sie 2014 02:35
    kafus6
    Poziom 14  

    Dzięki za podpowiedź:)

    Mam tylko jeden mały problem.
    Nie umiem napisać Query dla SQl'a

    Dla przykładu zrobiłem sobie coś takiego:

    Kod: sql
    Zaloguj się, aby zobaczyć kod


    Z tym, że on chce dodatkowo wszystkie inne kolumny z tabeli Parts wypełniać...
    Kod: sql
    Zaloguj się, aby zobaczyć kod

    Jak ma to wyglądać, żeby edytował tylko i wyłącznie jedna kolumnę (AutoFillWLM)
    wartością ze zmiennej ( w tym przypadku z columny Permit z tabeli UserLogin, która równa się zmiennej zapisanej w c# ,ale to nie istotne teraz)

    0
  • #4 23 Sie 2014 16:09
    kafus6
    Poziom 14  

    OK, wiec zrobiłem to trochę inaczej. Zamiast dodawać kolejną kolumnę do Tabeli, dodałem do <asp>

    Kod: asp
    Zaloguj się, aby zobaczyć kod


    W kodzie stworzyłem voida odpowiadającego OnRowCommand:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Ale niestety dalej zapytanie do bazy jest złe... Dalej program chce wkładać we wszystkie niewymienione kolumny wartości null.
    Kod: sql
    Zaloguj się, aby zobaczyć kod


    edit:
    Teraz już wiem o co chodzi... nie chce 'INSERT INTO' a 'UPDATE' :)
    Teraz pojawił mi się pewien problem z tym zapytaniem.

    tak wiec: chce update'ować komórkę w kolumnie LastModified wartością zapisaną w Permit.

    Zrobiłem tak:
    Kod: sql
    Zaloguj się, aby zobaczyć kod


    Teraz wpisał wartość Permit do kolumny LastModified wszędzie, tylko pominął właśnie ten edytowany wiersz........
    Może jeszcze powiem dokładniej o co mi chodzi.

    Zmienna Permit jest brana z innej tabeli i jest to wartość przyporzadkowana zlogowanemu użytkownikowi.
    Chciałbym teraz do kolumny w tabeli (którą to użytkownik edytuje) dodać zmienna permit, tak aby było widać kto ostatni zmieniał dany wiersz ...

    ASP.NET C# - Dodawanie zmiennej do gridview

    Próbowałem nawet w ten sposób:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    ale wynik taki sam jak poprzednio. Wszystkie wartości w kolumnie się zmieniają oprócz samej zmienianej. Jak zmienie buttonEditRow +"' = 'false'" na 'true'; - wartość z edytowanego wiersza(i tylko z tego wiersza) znika.

    0
  • #5 23 Sie 2014 17:49
    wiesniak
    Poziom 31  

    Kolego, sugeruję poszukać, jak się robi update - na pewno nie za pomocą SelectCommand ("sda.SelectCommand = cmd;"). Sugeruję też przestudiować linia po linii swój kod - robisz select (łącznie z pobieraniem danych do datasetu) tylko zapytanie zmieniasz na update.
    W zasadzie masz dwie możliwości: albo weźmiesz to co wydziubałeś i użyjesz ExecuteNonQuery, albo zaciągniesz interesujący Cię wiesz, zmienisz jego zawartość w DS, po czym zrobisz ds.SaveChanges() (tylko oczywiście musisz zdefiniować polecenie do update'u i ewentualnie insertu).

    0
  • #6 23 Sie 2014 22:59
    kafus6
    Poziom 14  

    No ok. Poszedłem za Twoimi wskazówkami:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Teraz edytowana Cell'a staje się pusta, a pozostałe w tej kolumnie zapełniają się właściwą zmienną Permit. Prawie dobrze...

    (btw. czy ktoś może dokładnie (łopatologicznie) wytłumaczyć mi to :
    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    Nie umiem tego zrozumieć. Przeczytałem definicje dla row dla cells dla row.cells itp. Potrzebuję, po porostu, żeby ktoś wytłumaczył po co to i kiedy się używa itp.

    0
  • #7 23 Sie 2014 23:11
    wiesniak
    Poziom 31  

    GridView to tak naprawdę zwykła tabelka.
    Row to wiersz, przekłada się na HTMLowy <tr>. Cells to komórki wiersza, każda komórka to <td>.
    To od strony HTML. Natomiast po stronie serwera zarówno GridViewRow jak i komórka określonego typu (dla uproszczenia przyjmijmy TableCell) są kontrolkami ASP.NET. Każda kontrolka zawiera kolekcję Controls, czyli zbiór kontrolek umieszczonych wewnątrz.
    Mówiąc inaczej, w row.Cells znajdziesz komórki, które też są w row.Controls.

    (TextBox)row.Cells[0].Controls[0]; - uważaj, żebyś się na tym nie przejechał - zrobisz enter w kodzie, żeby poformatować i aplikacja Ci się wywali, bo zamiast TextBox będziesz miał Literal. Generalnie jeśli potrzebujesz jakąś wartość wyciągać z grida, to używaj DataKeyNames i DataKeys. W markupie grida DataKeyNames możesz podawać po przecinku (bez spacji). Będą one dostępne w kolekcji DataKeys[indexWiersza].Values[nazwa].
    Co do Twojego update, to zastanawia mnie, dlaczego nie masz tam żadnego WHERE.

    0
  • #8 24 Sie 2014 03:52
    kafus6
    Poziom 14  

    kontynuując Twój wykład na temat row.cells[].Controls[] chciałem się zapytać, jakie przykładowe kontrolki kryją się pod np. [0] lub [1]. Przykładowe bo nie umiem sobie tego zwizualizować. Cells rozumiem- to są kolejne komórki w wierszu. a Controls to są kolejne Kotrolki w wierszu, tak ? jeśli tak to co to za kontrolki? :)

    Powracając jednak do zadania. Poszperałem, poznajdywałem i wpadłem na pomysł, ale oczywiście nie wypalił :( jedyną dobrą rzeczą jest jednak to, że wpisuje null w kolumnę gdzie ma być moja zmienna Permit ( chociaż wiem i jestem pewny, że czyta ją dobrze , bo w innych miejscach działa(ale nie w gridview).

    Można powiedzieć, że zminimalizowałem kod...

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    I giveUp(); :(

    ps. a z tymi datakeyname'sami to próbowałem, ale po1h kombinowania- zrezygnowałem...


    Edit:
    Mój problem polega na ustaleniu WHERE. Kombinuje więc tak, że dane ma wprowadzić(WHERE) w miejsce gdzie aktualnie jest aktywny button 'Update' (w danym wierszu).
    Teraz sobie uświadomiłem, że gdy już kliknie się na button 'Update' i program zaczyna sprawdzać... to on już nie jest aktywny... bo jest kliknięty(czyż nie jest tak?) dlatego nie ma aktywnego buttona 'Update' i nigdzie nie wpisuje mojej zmiennej Permit... lol. Zabij mnie jeśli nie mam racji przynajmniej w tym przypadku:)
    Tak więc, jak mam ustalić (WHERE) ? :(

    0
  • #9 24 Sie 2014 09:22
    wiesniak
    Poziom 31  

    Strony mają strukturę hierarchiczną - kontrolki w kontrolkach. Strona, dziedzicząc po klasie Page, też posiada kolekcję Controls. Na stronie na pewno masz form, więc w Page.Controls na pewno znajdzie się Form. Jeśli na formie umieścisz dwa przyciski i etykietę, to w Form.Controls będziesz miał te dwa przyciski i label. Prawdopodobnie też będą tam kontrolki Literal zawierające tekst odstępów między kontrolkami (bo zwykle formatujesz markup strony, żeby był czytelny).
    Innymi słowy, to nie jest tak, że pod Controls[0] będzie zawsze textbox, a pod Control[1] label. Jakie kontrolki, ile oraz kolejność zależą od definicji w markupie oraz ewentualnie kod kodu po stronie serwera, jeśli jakieś kontrolki są w kodzie dodawane.

    W kwestii Twojego problemu: zacznij analizować to, co piszesz, bo teraz coś robisz, ale sam chyba nie rozumiesz co.

    WHERE '" + commandup + "' = 1" - czyli co,
    WHERE 1 = 1
    ? Jaki jest w tym sens? Dlaczego nie zapoznasz się ze składnią SQL? Zwykle w klauzuli where umieszcza się warunek na identyfikator wiersza, jeśli robi się update. Wtedy dotyczy on tylko tego wiersza, który edytujesz.
    To, co wcześniej miałeś z DataKeys było dobre. Wystarczyło dodać i pobierać kolejne wartości.

    0
  • #10 24 Sie 2014 12:19
    kafus6
    Poziom 14  

    O.o...1 = 1 :) Faktycznie- teraz to by było logiczne :) Na swoją obronę mogę tylko dodać godzinę o której to pisałem (patrz mój post wyżej:))
    Dzięki za tłumaczonko.
    Czy tak może być ?

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Nie wiem czy to zadziała. Akurat nie mam jak sprawdzić, a chcę się już na najbliższą przyszłość upewnić...


    Edit: nie, to nie działa. Coś jeszcze muszę dodać do tego, ale nie wiem co :) Jak to zmusić do działania?

    0
  • #11 25 Sie 2014 00:40
    wiesniak
    Poziom 31  

    Skąd założenie, że indeks w gridzie będzie tym samym, co PartsID?
    Użyj indeksu by wyciągnąć ID z DataKeys (tylko pamiętaj, by ustawić odpowiednio DataKeyNames).

    0
  • #12 25 Sie 2014 02:26
    kafus6
    Poziom 14  

    Aż się spociłem...
    Tak by to wyglądało:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Wsadziłem tam Response.Write bo chciałem sprawdzić czy pobiera dobry PartsID. Faktycznie pobiera :)
    Niestety... kolumna LastModified pozostaje pusta :(. Co tym razem jest nie tak ?

    0
  • #14 25 Sie 2014 20:19
    kafus6
    Poziom 14  

    no ok, debugowanie debugowaniem, ale to nie działa!! :(
    Powiedz mi proszę czy to co tam wypociłem jest ok ?

    Dodano po 4 [godziny] 13 [minuty]:

    Tak jak mówiłem komórka pozostaje pusta nadal...


    Edit: Ok, działa wszystko :)
    musiałem jeszcze usunąć z UpdateCommand w asp nazwę tej kolumny :)
    Wielkie dzięki za pomoc, temat zamykam :)

    0