Avatar billede padrino Nybegynder
22. april 2007 - 21:12 Der er 5 kommentarer og
1 løsning

DataGrid: Link på column header

Til alle ASP.NET hajer:
Jeg har brug for lidt hjælp til at oprette et DataGrid 100% dynamisk, som får myDataGrid.DataSource fra en DataTable.
myDataGrid tilføjes en PlaceHolder som -> placeHolder.Controls.Add(myDataGrid);

Det DataGrid som jeg vil lave ser ud som nedenstående tabel - jeg har brug for hjælp til at gøre header'en (som er understreget) click'able/link som fyrer en event, hvorfra jeg kan få nummeret på den kolonne som der er blevet klikket på (fx kolonne nr.1 som har navnet Bookingklasse).

<table cellspacing="0" rules="all" border="1" style="border-collapse:collapse;">
    <tr>
        <td>Bookingklasse</td><td><u>01-01-2007<br/>23-06-2007</u></td><td><u>24-06-2007<br/>21-08-2007</u></td><td><u>22-08-2007<br/>15-12-2007</u></td><td><u>16-12-2007<br/>31-12-2007</u></td><td><u>01-01-2008<br/>31-03-2008</u></td>

    </tr><tr>
        <td>L</td><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td>
    </tr><tr>

        <td>V</td><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td>
    </tr><tr>
        <td>T</td><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td>
    </tr><tr>
        <td>H</td><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td>

    </tr><tr>
        <td>K</td><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td>
    </tr>
</table>

Jeg vil sætte pris på et komplet eksempel, men link til andre sider eller tutorials er også ok.
Avatar billede snepnet Nybegynder
23. april 2007 - 20:14 #1
Som udgangspunkt vil jeg nok foreslå dig at kigge på et gridview i asp.net 2.0, men du burde kunne får kolonnen clickable ved at angive AllowSorting = true, og sætte et SortExpression på hver kolonne.

Du kan så abbonnere på SortCommand-eventet og få det respektive sortexpression direkte på den DataGridSortCommandEventArgs instans du "får i hånden".

Såh... Noget i denne stil, hvis det skal være dynamisk:

DataGrid grid = new DataGrid();
grid.AllowSorting = true;
grid.SortCommand += new DataGridSortCommandEventHandler(grid_SortCommand);

BoundColumn c = new BoundColumn();
c.DataField = "SomeProperty";
c.HeaderText = "header";
c.SortExpression = "SomeProperty";
grid.Columns.Add(c);

grid.DataSource = GetData(); // formodes så at returnere noget med en SomeProperty
grid.DataBind();

Og din handler til SortCommand:
void grid_SortCommand(object source, DataGridSortCommandEventArgs e)
{
    Response.Write(e.SortExpression);
}

Ikke at den kan bruges til noget - det er bare for at du kan se hvordan du får fat i sortexpression.

Mvh
Avatar billede padrino Nybegynder
26. april 2007 - 12:40 #2
Ja, det virker. Men jeg får to ens kolonner ... kan ikke helt gennemskue hvad jeg gør galt. Måske du vil tage et kig - på nedenstående kode får jeg følgende kolonner |ID|NAME|ID|NAME|

public partial class DataGridSort : System.Web.UI.Page
{
    #region constants
    const string NAME = "NAME";
    const string ID = "ID";
    #endregion

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
        }
    }

    #region Web Form Designer generated code
    override protected void OnInit(EventArgs e)
    {
        InitializeComponent();
        base.OnInit(e);
    }

    private void InitializeComponent()
    {
        this.Load += new System.EventHandler(this.Page_Load);
        loadDynamicGrid();
    }
    #endregion

    void loadDynamicGrid()
    {
        #region Code for preparing the DataTable
        //Create an instance of DataTable
        DataTable dt = new DataTable();

        //Create an ID column for adding to the Datatable
        DataColumn dcol = new DataColumn(ID, typeof(System.Int32));
        dcol.AutoIncrement = true;
        dt.Columns.Add(dcol);

        //Create an ID column for adding to the Datatable
        dcol = new DataColumn(NAME, typeof(System.String));
        dt.Columns.Add(dcol);

        //Now add data for dynamic columns
        //As the first column is auto-increment, we do not have to add any thing.
        //Let's add some data to the second column.
        for (int nIndex = 0; nIndex < 10; nIndex++)
        {
            //Create a new row
            DataRow drow = dt.NewRow();

            //Initialize the row data.
            drow[NAME] = "Row-" + Convert.ToString((nIndex + 1));

            //Add the row to the datatable.
            dt.Rows.Add(drow);
        }
        #endregion

        DataGrid grid = new DataGrid();
        grid.AllowSorting = true;
        grid.SortCommand += new DataGridSortCommandEventHandler(grid_SortCommand);

        BoundColumn c = new BoundColumn();
        c.DataField = dt.Columns[0].ColumnName.ToString();
        c.HeaderText = "ID";
        c.SortExpression = dt.Columns[0].ColumnName.ToString();
        grid.Columns.Add(c);

        BoundColumn d = new BoundColumn();
        d.DataField = dt.Columns[1].ColumnName.ToString();
        d.HeaderText = "NAME";
        d.SortExpression = dt.Columns[1].ColumnName.ToString();
        grid.Columns.Add(d);

        grid.DataSource = dt; // formodes så at returnere noget med en SomeProperty
        grid.DataBind();

        pHolder.Controls.Add(grid);
    }

    void grid_SortCommand(object source, DataGridSortCommandEventArgs e)
    {
        Response.Write(e.SortExpression);
    }
}
Avatar billede snepnet Nybegynder
26. april 2007 - 18:58 #3
Bare sæt AutoGenerateColumns=false på dit grid:

DataGrid grid = new DataGrid();
grid.AllowSorting = true;
grid.AutoGenerateColumns = false;

Så viser den kun det du beder om :o)

Mvh
Avatar billede padrino Nybegynder
27. april 2007 - 16:22 #4
Super...Jeg tænkte nok det var noget simpelt, som grid.AutoGenerateColumns = false;
Takker
Avatar billede snepnet Nybegynder
27. april 2007 - 18:03 #5
Det var så lidt :o)
Vil du ha' et svar her så?
Mvh
Avatar billede padrino Nybegynder
27. april 2007 - 20:43 #6
yes, point er afgivet.
Takker endnu en gang.
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