Avatar billede joink Nybegynder
09. maj 2005 - 12:53 Der er 7 kommentarer og
1 løsning

DataGrid Kolonne Header

Hvordan kan jeg få fat i kolonne-headertext på et DataGrid hvor kolonnerne er autogenerede? Når der er autogenereret er Columns på DataGrid'et naturligvis null.
Avatar billede snepnet Nybegynder
09. maj 2005 - 13:05 #1
kolonneoverskrifterne sættes normalt til dine kolonnenavne (hvis det er en datatabel ell. du binder til)...
får du ingen headertekster overhovedet ?
(du må gerne lige skrive lidt om hvad du binder til etc).
mvh
Avatar billede joink Nybegynder
09. maj 2005 - 15:24 #2
Hey. Jeg binder til en collection jeg selv har lavet. Dvs. ved autogenerate columns bliver kolonnerne lavet udfra de properties der er. Det jeg skal er at sætte nogle attributter ved bestemte kolonnenavne på hver enkelt række og det er lidt svært hvis jeg ikke kender kolonnenavnet.
Avatar billede snepnet Nybegynder
09. maj 2005 - 16:37 #3
hmm.... bare lige så vi snakker om det samme :

er det sådan noget her du er ude efter (bare som eksempel) :

public class SomeClass
{
    [GridColumn(ViewMode.Visible)]
    public string SomeString
    {
        get{return "test";}
    }

    [GridColumn(ViewMode.Hidden)]
    public string SomeString
    {
        get{return "test";}
    }
}

mvh
Avatar billede snepnet Nybegynder
09. maj 2005 - 17:36 #4
du kan bare tage kolonnerne pr. index... så du i din ItemDataBound manipulere det du har behov for.
(som du kan forstå er jeg ikke 100% sikker på at jeg har fanget hvad du vil :oD)

hvis du giver et konkret eksempel på hvad du præcist vil opnå - så skal du få et eksempel.

mvh
Avatar billede joink Nybegynder
12. maj 2005 - 15:25 #5
Hey.

Fandt aldrig ud af det, så jeg lavede bare noget "fusk", gad ikke prøve på at løse problemet mere. :-/ Hmm...

Så, da jeg slet ikke kan få fat i kolonner når de er autogenerede gemte jeg kolonne-navnene i korrekt rækkefølge i et array.

Tror godt det kan lade sig gøre at få fat i kolonnerne vha. af noget reflection, men det er overkill til de små ting jeg skal med det.

Du må godt få point alligevel, hvordan er det nu jeg gør det... har glemt hvordan.
Avatar billede snepnet Nybegynder
12. maj 2005 - 20:29 #6
jeg giver dig et svar - så tror jeg der kommer en rude frem hvor du kan markere min navn og acceptere :o)

men bortset fra det, så er det relativt let at opbygge dit grid dynamisk (på dine premisser), frem for at sætte autogenerate til true.

du kan lige få et lamt (bare så du kan se teknikken) eksempel hvordan du kan gøre det med custom typer og attributter :

først en attribut (så vi kan angive om kolonnen er synlig eller ej) :

[AttributeUsage(AttributeTargets.Property)]
public class GridColumnAttribute : Attribute
{
    private ViewMode mode;

    public ViewMode Mode
    {
        get{return mode;}
    }

    public GridColumnAttribute(ViewMode mode)
    {
        this.mode = mode;
    }
}   

viewmode er bare sådan en her :

public enum ViewMode
{
    Show,
    Hide
}

så din egen type, hvor du klasker attributten på, hvor det nu passer sig :

public class SomeClass
{
    [GridColumn(ViewMode.Show)]
    public string SomeString
    {
        get{return "String";}
    }
   
    [GridColumn(ViewMode.Show)]
    public string SomeOtherString
    {
        get{return "OtherString";}
    }
}

og du kan så opbygge et grid f.eks. sådan her :

// en liste til dine objekter
ArrayList al = new ArrayList();
for(int i=0;i<10;i++)
{
    al.Add(new SomeClass());
}

// et grid
DataGrid dg = new DataGrid();
dg.AutoGenerateColumns = false;
dg.DataSource = al;

// vi checker hvad der skal vises
PropertyInfo[] pinfo = al[0].GetType().GetProperties();
foreach(PropertyInfo p in pinfo)
{
    object[] attribs = p.GetCustomAttributes(typeof(GridColumnAttribute), false);

    if(attribs.Length > 0)
    {
        GridColumnAttribute gca = (GridColumnAttribute)attribs[0];
        if(gca.Mode == ViewMode.Show)
        {
            // indsætter kolonnen hvis attributten siger det
            BoundColumn bc = new BoundColumn();
            bc.HeaderText = p.Name;
            bc.DataField = p.Name;
            bc.ItemStyle.BackColor = (Color) Enum.Parse(typeof(Color), gca.BgColor, true);
            dg.Columns.Add(bc);
        }
    }
}

// binding, og ind på formen
dg.DataBind();
Form1.Controls.Add(dg);

.
.
.

Måske et lidt fjollet eksempel - der er lettere veje til en usynlig kolonne, men du kan måske bruge det som inspiration til noget mere anvendeligt.

mvh
Avatar billede snepnet Nybegynder
16. maj 2005 - 22:04 #7
æh.... NU giver jeg dig et svar :oD
mvh
Avatar billede joink Nybegynder
17. maj 2005 - 08:37 #8
Det er i orden. Er noget lignende det dér jeg har gjort for at løse problemet. Takker.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester