[GridView i subkolumny] jak stworzyć

0

Mam GridView i tam jest 5 kolumn poniedziałek, wtorek ...... piątek. I chcę dodawać w tym GridView sub kolumny. Np żeby w kolumnie poniedziałek były 3 sub kolumny gr1, gr2, gr3. Ich ilość nie jest stała więc dobrze by było generować je dynamicznie. Ale jeśli będzie statycznie to też mi bardzo pomoże.
Jeśli ktoś z was robił coś takiego lub wie jak to zrobić to bardzo bym prosił o jakieś wyjaśnienie albo prosty przykład.
Z góry dziękuję

0

prosto sie nie da
mozesz poszukac na codeproject.com lub uzyc kontrolek komercyjnych: devexpress, telerik, componentone, etc.

0

Może być nie prosto jak tylko wiesz jak.
A kontroli komercyjne hmm raczej odpadają, to co robię jest częścią większego projektu akademickiego i nie wolno nam używać niczego płatnego.

0

zeby jeszcze nie bylo niejasnosci mowimy o windows forms, a nie o asp .net? tak?

0
Kaa napisał(a)

A kontroli komercyjne hmm raczej odpadają, to co robię jest częścią większego projektu akademickiego i nie wolno nam używać niczego płatnego.

A bezpłatnego?
http://www.devexpress.com/Products/Free/WebRegistration60/
Teleriki zaś całkiem nie dawno też były za darmo w ramach jakiejś promocji.

Natomiast myślę, że rozwiązaniem jest zrobienie własnego DataGridView z własnym typem komórki nagłówkowej, która zajmie obszar kilku standardowych. Tak przynajmniej rozumiem to wyzwanie.

0

ja raczej nie szalalbym z calym wlasnym GridView, ale z jedna kolumna, tzn.
implementujesz wlasna DataGridViewColumn, ktora ma w sobie kolekcje kolumn (nie koniecznie juz typu DataGridViewColumn)
dalej musisz zaimplementowac reprezentacje komorki - DataGridViewCell
i w trybie edycji IDataGridViewEditingControl
pomoce:
http://msdn.microsoft.com/en-us/library/ms180996.aspx

oczywiscie twoja komorka powinna reprezentowac kilka komorek
DataGridViewColumn ma wlasciwosc HeaderCell, licze ze da sie stworzyc wlasna reprezentacje komorki headera dziedziczaca z DataGridViewColumnHeaderCell , ktora jako HeaderCell bedzie zwracala twoja kolumna
wlasna klasa komorki headera powinna umiec nawysowac header kolumny nadrzednej i odpowiedniej liczby podkolumn

generalnie ciekawe wyzwanie, moze jak znajde chwile sam sie za to wezme
ale ponownie sugeruje przeszukanie codeproject.com, bo pewnie nie jestes pierwszy, ktory ma taki problem i byc moze ktos juz to zrobil

0

Niestety chodzi o aplikacje internetową asp .net.
codeproject.com szukałem było coś o GridView zagnieżdżonym w GridView czyli prościej mówiąc w GridView wyświetlić kolejny GridView.
Na razie jeszcze nie zdążyłem tego wypróbować gdyż gonią mnie inne terminy ale jak znajdę chwilkę to wyrębuję i jeśli zadziała w ciekawy sposób to może nawet pochwale się kodem tego rozwiązania.
Przejrzę także materiały które mi podesłaliście i za które szczególnie wam dziękuję.
Mam nadzieję w niedługim czasie (2 tygodnie max) wypracować rozwiązanie, a jak nie to :/ dalej bede pracował ale już do wersji drugiej.

0

e, no jak asp .net to jest duuuuuzo prosciej niz z forms'ami D:D

jak zlapiesz zdarzenie RowCreated to mozesz np. polaczyc naglowki kilku kolumn:

        protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.Header)
            {
                var cell1 = e.Row.Controls[0] as DataControlFieldHeaderCell;
                cell1.ColumnSpan = 2;
                e.Row.Controls.RemoveAt(1);
            }
        }

a jak zlapiesz PreRender, to mozesz dodac wlasny row na tabela, ktory odpowiednio zgrupuje ci juz istenijace kolumny:

protected void GridView1_PreRender(object sender, EventArgs e)
        {
            var row = new GridViewRow(-1, -1, DataControlRowType.Header, DataControlRowState.Normal);
            
            var td1 = new TableCell();
            td1.ColumnSpan = 2;
            td1.Text = "header 1";

            var td2 = new TableCell();
            td2.ColumnSpan = 2;
            td2.Text = "header 2";

            row.Controls.Add(td1);
            row.Controls.Add(td2);
            
            GridView1.Controls[0].Controls.AddAt(0, row);
        }

kwestie jak ladnie udostepnic to w trybie design pozostawiam tobie, chyba ze walniesz brzydki hardcode w kodzie co z czym grupowac ;)

0

Jeszcze takie pytanie czy da rade zrobić to samo z dynamicznie generującym się griview, bo grupowanie zależałoby od tego ile danych jest wczytanych. byłoby co najmniej 10 kolumn a ilość pod kolumn jest uzależniona od bazy danych. Przynajmniej w założeniach.

P.S. Dostałem małego kręćka z twoim kodem i nie wiem jak mam go wykorzystać :/ i tak już poruszam się po omacku. Jeśli mógłbyś to proszę wyjaśnij mi swój kod

0

kluczowe hasla: cykla życia kontrolki, cykl życia strony, bindowanie danych do grid

kiedy bindujesz dane do grid dla kazdego wiersza (takze headera i footera) odpala sie zdarzenie RowCreated - tworza sie kontrolki budujace row, dane do nich jeszcze nie sa zbindowane
nastepnie dla kazdego wiersza odpala sie RowDataBind - tu nastepuje bindowanie danych do kontrolek
PreRender jest zdarzeniem, ktore poprzedza zdarzenie Render (czyli kontrolka jest wypluwana w postaci html), a wykonuje sie po Load i wszystkich innych eventach np. klik przycisku

wiec to co zrobilem to:

  • w RowCreated polaczylem naglowki kilku kolumn w jeden (nie do konca to co chciales)
  • w PreRender nad oryginalnym wierszem naglowka grid dodalem jeszcze jeden, ktory tez niektore komorki ma polaczone, dzieki temu wszystkie kolumny grida zachowuja defaultowa funkcjonalnosc
    zeby osiagnac idealnie to co chciales trzebaby jeszcze polaczyc komorki w kolumnie w naglowku, czyli jesli jakas kolumna nie ma subkolumn, to teraz bedzie miala naglowek z 2 komorek, trzeba w nowym row odpowiednim komorkom ustawic rowspan=2 pamietajac, zeby orygianlna wartosc dolnej komorki przeniesc do gornej :)
0

Poddaje się :/ w żaden sposób nie potrafię tego zrobić. C# jest dla mnie nowym językiem i do tego jeszcze ASP NET. :( Będę musiał zrezygnować z projektu.

0

a wujek mówił poszukaj na codeproject.com
a stare porzekadło mówi: za każdym razem gdy wpadniesz na nowy pomysł, ktoś już to zrobił przed tobą

http://www.codeproject.com/KB/webforms/MergeDatagridHeader.aspx
http://www.codeproject.com/KB/aspnet/Merge_Header.aspx
http://www.codeproject.com/KB/aspnet/Merge_cells_in_GridView.aspx

pewnie jeszcze kilka sie znajdzie
z grubsza z tego co widzialem generalna zasada opiera sie na rozwiazaniach ktore podalem

0

Generalnie to na jakich zasadach opiera się twoja metoda ?
Bo szczerze mówiąc to nawet nie wiem jak mam przygotować Grida pod ten zasady.
Miałem wstawionego Grida i nie specjalnie to zadziałało to samo z Gridem wypełnionym na prędko danymi.
Już nie wiem z której strony to czytać :/

0

=====odnośnie tego wyżej ^ przepraszam mój błąd :/ za dużo już przy tym siedzę=====

Generalnie to na jakich zasadach opiera się twoja metoda ?
Bo szczerze mówiąc to nawet nie wiem jak mam przygotować Grida pod ten zasady.
Miałem wstawionego Grida i nie specjalnie to zadziałało to samo z Gridem dynamicznym wypełnionym na prędko danymi.
Już nie wiem z której strony to czytać :/
Nie chce gotowca ale proszę pomóż mi zrozumieć jak to zrobić chociaż na statycznym Gridzie
1 Przeciągam GridView na forme i dodaje 4 kolumny
Co dalej ??

0

grid renderowany jest jako table
jak osiagnac zamierzony przez ciebie efekt w html'owej table aby miala tak polaczone komorki? dla td/th uzywasz atrybutow colspan i rowspan

i to wlasnie staramy sie zrobic

jest na to kilka sposobow, ja proponuje w PreRender grid'a wstawic dodatkowy wiersz tabeli jako pierwszy i odpowiednio polaczyc komorki tabeli
oczywiscie najprostsze rozwiazanie to masz dla tego konkretnego grida w kodzie zahardcodowane jakie kolumny powinny miec jeszcze jeden nadrzedny wspolny naglowek, a ktore nie
rozwiazanie trudniejsze - stworzyc kontrolke, ktora bedzie umozliwiala zrobic to dla kazdego grid'a z dowolnymi kolumnami, ale chyba masz jeszcze za mala wiedze, jesli takie rozwiazanie chcesz wybrac, proponuje pocwiczyc na prostrzych kontrolkach, pozniej zobaczyc jak dzialaja ITemplate, jak odpowiednio opisac propertisy aby byly widoczne w propertygirdzie i jak stworzyc edytory dla bardziej skomplikowanych wlasciwosci, np. jak zrobic edytor kolekcji kolumn etc.

wracajac do rozwiazania prostego
zdefiniuj jakas liste symbolizujaca kolumny do dodania, kazdy obiekt bedzie zawieral informacje o tekscie naglowka i ile kolumn za zajmowac, np.
class HeaderColumnInfo
{
public string Text { get; set; }
public int Cols { get; set; }
}
masz tabele z 5 kol. i chcesz zeby 1 i 2 oraz 4 i 5 mialy nadrzedne wspolne headery
{"Kolumny 1 i 2", 2}, {"", 1}, {"Kolumny 4 i 5", 2}

w PreRender
tworzymy nowy row, a nastepnie iterujemy przez liste obiektow HeaderColumnInfo
dla kazdego obiektu tworzymy nowy cell i odpowiednio ustawiamy text zanajdujacy sie w komorce oraz colspan tej komorki, jesli nasza HeaderColumnInfo ma Cols=1 to laczymy bierzemy oryginalna komorke headera, ktora powinna byc w tym miejscu, usuwamy ja z oryginalnego wiersza naglownka, dodajemy do naszego wiersza i ustawiamy tej komorce rowspan na 2
i powinno dzialac :)

0

Yyy dobra inaczej
mam WebForm2.asp.cx o takiej zawartości

namespace Rezerwacje
{
    public partial class WebForm2 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            LoadDataToGridView();

        }

        protected void GridView1_PreRender(object sender, EventArgs e)
        {
            var row = new GridViewRow(-1, -1, DataControlRowType.Header, DataControlRowState.Normal);

            var td1 = new TableCell();
            td1.ColumnSpan = 2;
            td1.Text = "header 1";

            var td2 = new TableCell();
            td2.ColumnSpan = 2;
            td2.Text = "header 2";

            row.Controls.Add(td1);
            row.Controls.Add(td2);

            GridView1.Controls[0].Controls.AddAt(0, row);
        }

        public void LoadDataToGridView()
        {
            GridView1 = Globals.SetGridTime(7, 20, GridView1);
        }
    }
}

gdzie Globals.SetGridTime(7, 20, GridView1); wczytuje tylko stringi do pierwszej kolumny

oraz WebForm2.aspx o takiej zawartości

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="Rezerwacje.WebForm2" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    
        <asp:GridView ID="GridView1" runat="server">
            <Columns>
                <asp:BoundField />
                <asp:BoundField />
                <asp:BoundField />
                <asp:BoundField />
            </Columns>
        </asp:GridView>
    
    </div>
    </form>
</body>
</html>

Co robię źle, czego brakuje żeby zmusić to do działania.
P.S. proszę jeśli możecie nie używajcie skrótów typu

{ get; set; }

Wcale nie pomagają w zrozumieniu tego co się dziej w kodzie :/

0

przede wszystkim komputer z fusow nie wrozy i nie wie ze dla gridView1 ma wykonac prerender
proponuje:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" onprerender="GridView1_PreRender">

i wlasciwie co to jest ?????
GridView1 = Globals.SetGridTime(7, 20, GridView1);
uzyj data source
GridView1.DataSource = coś;
GridView1.DataBind();

{ get; set; }

Wcale nie pomagają w zrozumieniu tego co się dziej w kodzie

mmmm? jak to nie, wiesz ze jest to Wlasciwosc, a nie Pole klasy (Property, not Field)
w niektorych sytuacjach nie mozna uzyc pol, poza tym wlasciwosc daje ci mozliwosc kontrolowania zwracania i ustawiania wartosci wlasciwosci

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