Avatar billede Simon Praktikant
28. september 2004 - 11:28 Der er 19 kommentarer og
1 løsning

bytte om på to kolonner i dataset

Hej, jeg har et dataset, som jeg binder til et datagrid.

For at indsætte en kolonne skriver jeg:
myDataSet.Tables[0].Columns.Add("NyKolonne");
Den nye kolone bliver indsat bag alle andre kolonner.

Hvordan flytter jeg en kolonne fra et sted til et andet i et DataSet?
Avatar billede Syska Mester
28. september 2004 - 12:07 #1
Ville tror det skal gøres i DataGrid'et.

Er bare lige med på en lytter når andre måske svarer
Avatar billede aaberg Nybegynder
28. september 2004 - 14:13 #2
Lad os sige du har 10 kolonner, og du vil bytte kolonnen med index 3 ud med den med index 7!.

DataColumn dummyColumn;
dummyColumn = myDataSet.Tables[0].Columns[7];
myDataSet.Tables[0].Columns[7] = myDataSet.Tables[0].Columns[3]
myDataSet.Tables[0].Columns[3] = dummyColumn;

Jeg vil umiddelbart tro at dette her virker.
Avatar billede aaberg Nybegynder
28. september 2004 - 14:14 #3
Lad os sige du har 10 kolonner, og du vil bytte kolonnen med index 3 ud med den med index 7!.

DataColumn dummyColumn;
dummyColumn = myDataSet.Tables[0].Columns[7];
myDataSet.Tables[0].Columns[7] = myDataSet.Tables[0].Columns[3]
myDataSet.Tables[0].Columns[3] = dummyColumn;

Jeg vil umiddelbart tro at dette her virker.

Jeg glemte at trykke svar, jeg prøver igen!!
Avatar billede Simon Praktikant
28. september 2004 - 16:21 #4
jeg har prøvet det her:
---------------------
System.Data.DataColumn dc = new System.Data.DataColumn("dc");
myDataSet.Tables[0].Columns[2]=dc;
----------------------
men får følgende meddelelse når jeg prøver at kompilere:

"Property or indexer 'System.Data.DataColumnCollection.this[int]' cannot be assigned to -- it is read only"

Jeg har så prøvet med at erklære kolonnen for ikke-read-only, sådan her:
-----------------------
myDataSet.Tables[0].Columns[2].ReadOnly=false;
System.Data.DataColumn dc = new System.Data.DataColumn("dc");
myDataSet.Tables[0].Columns[2]=dc;
---------------------
men det hjælper ikke
Avatar billede Syska Mester
28. september 2004 - 17:03 #5
Det er da heller ikke sådan han skriver....

DataColumn er vel også kun sig selv, der kan vel ikke være flere af dem, har du prøve at fjerne det der "dc"?
Avatar billede snepnet Nybegynder
28. september 2004 - 17:14 #6
er det udelukkende fordi du gerne vil have det præsenteret i en anden rækkefølge i datagriddet ?
så synes jeg i givet fald du skal fikse det der.... der angiver du bare kolonnerne i den rækkefølge du vil have dem vist.

F.eks. sådan her :

<asp:datagrid id="DataGrid1" runat="server"    AutoGenerateColumns="False">
    <Columns>
        <asp:BoundColumn DataField="FldInt" HeaderText="FldInt"></asp:BoundColumn>
        <asp:BoundColumn DataField="FldString" HeaderText="FldString"></asp:BoundColumn>
    </Columns>
</asp:datagrid>

Der kan du jo bare bytte om på kolonnerne :

<asp:datagrid id="DataGrid1" runat="server"    AutoGenerateColumns="False">
    <Columns>
        <asp:BoundColumn DataField="FldString" HeaderText="FldString"></asp:BoundColumn>
        <asp:BoundColumn DataField="FldInt" HeaderText="FldInt"></asp:BoundColumn>
    </Columns>
</asp:datagrid>
Avatar billede snepnet Nybegynder
28. september 2004 - 17:16 #7
Er du gal hvor jeg sidder og sover :o)
Se fuldstændig bort fra ovenstående hvis det er en winform du arbejder med :oD
Avatar billede snepnet Nybegynder
28. september 2004 - 17:16 #8
men du kan jo lige skrive om det er win eller web.... jeg kan godt skrive et wineksempel også.

mvh
Avatar billede Simon Praktikant
28. september 2004 - 17:17 #9
Ja det er en winform.
Avatar billede snepnet Nybegynder
28. september 2004 - 20:41 #10
Du kan gøre det samme i en winform... altså styre kolonnerne.

Du kan se et VB-eksempel her :

http://www.thescarms.com/dotNet/ColumnStyles.asp
Avatar billede snepnet Nybegynder
28. september 2004 - 20:56 #11
(faktisk står det også i C# længere nede :o)
Avatar billede Syska Mester
29. september 2004 - 17:19 #12
er det svar nok fra snepnet?
Avatar billede snepnet Nybegynder
02. oktober 2004 - 02:28 #13
simi ?
Avatar billede Simon Praktikant
02. oktober 2004 - 02:37 #14
Jeg har set på koden her
http://www.thescarms.com/dotNet/ColumnStyles.asp
men kan ikke lige gennemskue hvordan man bytter om på to eksisterende kolonner. Jeg har ikke lige haft så meget tid til det, men det kommer.

I øvrigt har jeg fundet en komponentpakke, Infragistics, med "ultraGrid" som kan det samme som dataGrid, men den kan kan også flytte rundt på kolonnerne.

Jeg holder lige spørgsmålet åbent ind til jeg har leget med koden fra linket. Jeg har ikke glemt det ;-)
Avatar billede snepnet Nybegynder
02. oktober 2004 - 13:16 #15
Hej simi :o)

du kan lige se et eksempel her... Det er godt nok et asp.net eksempel, men der arbejdes på DataTables og DataViews (som er generelle)...
Det er så kun den måde det skrives ud på du ikke lige kan bruge til noget (det udskrives til at asp.net datagrid).

det er ikke noget jeg har skrevet, og det meste af koden drejer sig om at generere dummydata (og der har du jo nok noget i forvejen :o)

det mest interessant for dig vil nok være det der står i page_load, og måden det realiseres på.

håber du kan bruge det til noget.

mvh

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace EXP2
{
    /// <summary>
    /// Summary description for ColumnOrderTrix.
    /// </summary>
    public class ColumnOrderTrix : System.Web.UI.Page
    {
        protected System.Web.UI.WebControls.DataGrid dg;
   
        private void Page_Load(object sender, System.EventArgs e)
        {
            //get datatable
            DataTable dt = GetDummyDataTable(25);

            //build dataview
            DataView dv = new DataView(dt,"FirstName LIKE '%j%'","JoinDate DESC",DataViewRowState.CurrentRows);

            //create new column order and filter
            ArrayList newColumns = new ArrayList();
            //define each column
            newColumns.Add(new ColumnDescription("Last Name","LastName"));
            newColumns.Add(new ColumnDescription("First Name","FirstName"));
            newColumns.Add(new ColumnDescription("Number of Lectures","Lectures"));
            newColumns.Add(new ColumnDescription("Date Member Joined","JoinDate"));

            //now convert the dataview to a datatable
            DataTable newDataTable = ConvertDataViewToDataTable(dv,newColumns);

            //display
            dg.DataSource = newDataTable;
            dg.DataBind();
            dg.CellPadding = 5;       
        }


        public static DataTable ConvertDataViewToDataTable(DataView dv,ArrayList newColumns)
        {

            //build a new DataTable based on the new columns
            DataTable dt = new DataTable();
            foreach(ColumnDescription cd in newColumns)
            {

                //get the information you need from the column object
                string headerText = cd.HeaderText;
                string dataFieldName = cd.DataFieldName;

                //create the new column in the datatable
                dt.Columns.Add(headerText);
            }


            //go through rows of dataview
            foreach(DataRowView drv in dv)
            {

                //go through each column of the dataview and create a corresponding datarow in the datatable
                DataRow dr = dt.NewRow();
                foreach(ColumnDescription cd in newColumns)
                {

                    //add content of each cell to the data
                    string headerText = cd.HeaderText;
                    string dataFieldName = cd.DataFieldName;
                    string cellContent = drv[dataFieldName].ToString();
                    dr[headerText] = cellContent;
                }
                dt.Rows.Add(dr);
            }

            return dt;
        }

        public struct ColumnDescription
        {

            //properties
            public string HeaderText;
            public string DataFieldName;

            //constructors
            public ColumnDescription(string headerText, string dataFieldName)
            {
                this.HeaderText = headerText;
                this.DataFieldName = dataFieldName;
            }
        }

        //this just returns datatable for this demo as if its from the database
        public static DataTable GetDummyDataTable(int numberOfRecords)
        {
            //create table
            DataTable dt = new DataTable("Members");
            dt.Columns.Add("ID",Type.GetType("System.Int32"));
            dt.Columns.Add("FirstName",Type.GetType("System.String"));
            dt.Columns.Add("LastName",Type.GetType("System.String"));
            dt.Columns.Add("Lectures",Type.GetType("System.Int32"));
            dt.Columns.Add("JoinDate",Type.GetType("System.DateTime"));

            //emulate id field
            DataColumn[] pk = new DataColumn[1];
            pk[0] = dt.Columns["ID"];
            dt.PrimaryKey = pk;
            dt.Columns["ID"].AutoIncrement = true;
            dt.Columns["ID"].AutoIncrementSeed = 1;
            dt.Columns["ID"].ReadOnly = true;

            //fill rows
            DataRow dr;
            int numberOfUniqueDummyRecords = 3;
            int dummyRecordCount = 1;
            for(int x=1;x<=numberOfRecords;x++)
            {

                switch(dummyRecordCount)
                {
                    case 1:
                        dr = dt.NewRow();
                        dr["FirstName"] = "Jim";
                        dr["LastName"] =  "Smith";
                        dr["Lectures"] = 14;
                        dr["JoinDate"] = DateTime.Now.AddDays(-595);
                        dt.Rows.Add(dr);
                        break;
                    case 2:
                        dr = dt.NewRow();
                        dr["FirstName"] = "Joseph";
                        dr["LastName"] =  "Thompson";
                        dr["Lectures"] = 3;
                        dr["JoinDate"] = DateTime.Now.AddDays(-1398);
                        dt.Rows.Add(dr);
                        break;
                    case 3:
                        dr = dt.NewRow();
                        dr["FirstName"] = "Susan";
                        dr["LastName"] =  "Palmer";
                        dr["Lectures"] = 12;
                        dr["JoinDate"] = DateTime.Now.AddDays(-677);
                        dt.Rows.Add(dr);
                        break;
                }

                //increment
                dummyRecordCount++;
                if(dummyRecordCount > numberOfUniqueDummyRecords)
                {
                    dummyRecordCount = 1;
                }
            }

            return dt;
        }

        override protected void OnInit(EventArgs e)
        {
            InitializeComponent();
            base.OnInit(e);
        }
       
        private void InitializeComponent()
        {   
            this.Load += new System.EventHandler(this.Page_Load);
        }
    }
}
Avatar billede Simon Praktikant
02. oktober 2004 - 13:27 #16
viser "Page_Load(object sender, System.EventArgs e)" ikke blot hvordan man opbygger en datatable?
Jeg tror I misforstår mit spørgsmål lidt.
Jeg kan sagtens oprette dataTables, dataSets, Rows, Columns, osv.
Jeg kan også godt slette en eksisterende kolonne, og indsætte en ny.
Men hvad jer efterspørger er en funktion eller noget, som kan bytte rundt på to kolonner.
for eksempel "byt_rundt_paa_kolonner(kolonne1, kolonne3);"
Intet andet skal så ske, end at der bliver byttet rundt, således at kolonne1 nu står der hvor kolonne3 stod før, og kolonne3 står der hvor kolonne1 stod.
Avatar billede snepnet Nybegynder
02. oktober 2004 - 14:27 #17
ok - ja så kan jeg godt at du ikke er så imporneret over diverse workarounds :o)
jeg tror dog jeg vil vove pelsen her og påstå, at du ikke har nogen mulighed for at gøre det på den måde.

hvis du får tabeller mv. oprettet automatisk, hvis du f.eks. bruger en adapter til at fylde et dataset, vil du med kode som dette :

someDataSet.Tables[0].Columns.Remove("someColumnName");
someDataSet.Tables[0].Columns.Add("someColumnName");

Fjerne kolonnen, og indsætte den et andet sted, hvorved data vil være forsvundet.

du kan definere tabeller og views mv. og du kan angive tablemappings på en måde så du får skabt et ændret billede af nogle datamængder, men at ændre et eksisterende
billede på den måde du angiver, tror jeg ikke er muligt.

men... hvis det er en uhendsigtsmæssig rækkefølge du får tingene ind i datasættet i, hvorfor ændrer du så ikke bare ?
(du kan jo bare lave din select så det kommer som du ønsker).

Alternativt synes jeg du skal benytte dig af selv at definere dine datasets og dine tabeller i koden - så kan du der sikre på hvilken måde de skal foreligge i applikationen.

// du får lige et lille kodeeksempel
hvis du har fuldstændig styr på det i forvejen beklager jeg, men jeg famler en lille smule i blinde da jeg har svært ved at få øje på at der skulle være et problem (altså selv om man ikke kan bytte om på kolonnerne på et eksisterende dataset... jeg synes der er så mange andre muligheder for at sikre at det passer til ens applikation).

men... her er et "dummydatalag", hvor dataset og tabeller er defineret... hvis du så bruger f.eks. en adapter til at fylde et dataset, kan du bare sørge for at fylde et dataset du selv har definere - og dermed selv har defineret i hvilken rækkefølge kolonnerne kommer i.

og med venlig hilsen herfra :o)

using System;
using System.Data;

using ByteFX.Data;
using ByteFX.Data.MySqlClient;

namespace ExpArticles.ExpData
{
    /// <summary>
    ///    Klasse der kan generere lidt sampledata, og returnere det som et DataSet
    /// </summary>
    /// <remarks>
    ///   
    /// </remarks>
    public class ExpDataAccess
    {       
        private int _autoRows = 10;
   
        /// <summary>
        ///    Default antal rækker der indsættes i tabellen, hvis ikke andet er angivet
        /// </summary>
        public int AutoRows
        {
            get{return _autoRows;}
            set{_autoRows = value;}
        }

        /// <summary>
        ///    SampleData med det antal rækker i tabellen der er angivet i AutoRows
        /// </summary>
        ///
        /// <returns>
        ///    Et SampleDataSet objekt
        /// </returns>
        public SampleDataSet GetSampleData()
        {
            SampleDataSet ds = new SampleDataSet();
            TableFillers.FillTable(ds.Tables[SampleTable.TableName], AutoRows);
            return ds;
        }

        /// <summary>
        ///    Returnerer et SampleDataSet
        /// </summary>
        /// <param name="numberOfRows" type="int">
        ///    <para>
        ///        Antallet af rækker der genereres i tabellen
        ///    </para>
        /// </param>
        /// <returns>
        ///    Et SampleDataSet objekt
        /// </returns>
        public SampleDataSet GetSampleData(int numberOfRows)
        {
            AutoRows = numberOfRows;
            return GetSampleData();
        }
    }

    /// <summary>
    ///    SampleDataSet
    /// </summary>
    /// <remarks>
    ///   
    /// </remarks>
    public class SampleDataSet : DataSet
    {
        public SampleDataSet() : base()
        {
            InitClass();
        }

        public void InitClass()
        {
            this.DataSetName = "SampleDataSet";
            this.Namespace = "ExpArticles";
            this.Tables.Add(new SampleTable());           
        }
    }

    /// <summary>
    ///    En SampleTable
    /// </summary>
    /// <remarks>
    ///   
    /// </remarks>
    public class SampleTable : DataTable
    {
        new public const string TableName = "SampleTableName";
       
        public const string FldId            = "FldId";
        public const string FldString        = "FldString";
        public const string FldInt            = "FldInt";
        public const string FldDateTime        = "FldDateTime";
        public const string FldDecimal        = "FldDecimal";
        public const string FldBool            = "FldBool";
       
        public SampleTable() : base(TableName)
        {
            InitClass();
        }

        private void InitClass()
        {
            DataColumn c = this.Columns.Add(FldId, typeof(int));
            c.AllowDBNull = false;
            c.AutoIncrement = true;
            c.AutoIncrementSeed = 0;
            c.AutoIncrementStep = 1;

            DataColumn[] pKeys = {c};
            this.PrimaryKey = pKeys;       
       
            c = this.Columns.Add(FldString, typeof(string));
            c.AllowDBNull = true;
            c.DefaultValue = "Sample String";

            c = this.Columns.Add(FldInt, typeof(int));
            c.DefaultValue = 100;
            c.AllowDBNull = true;

            c = this.Columns.Add(FldDateTime, typeof(DateTime));
            c.DefaultValue = DateTime.Now;
            c.AllowDBNull = true;

            c = this.Columns.Add(FldDecimal, typeof(Decimal));
            c.DefaultValue = 100.00;
            c.AllowDBNull = false;

            c = this.Columns.Add(FldBool, typeof(bool));
            c.AllowDBNull = false;
            c.DefaultValue = false;
        }
    }

    /// <summary>
    ///    Klasse der er i stand til at generere et antal rækker i en tabel.
    ///    Rækkerne fyldes med defaultværdier, hvis nogle er angivet i tabellen.
    /// </summary>
    /// <remarks>
    ///   
    /// </remarks>
    public class TableFillers
    {
        /// <summary>
        ///    Metode til at fylde rækker i en tabel.
        /// </summary>
        /// <param name="table" type="System.Data.DataTable">
        ///    <para>
        ///        Den tabel rækkerne skal fyldes i 
        ///    </para>
        /// </param>
        /// <param name="numberOfRows" type="int">
        ///    <para>
        ///        Antallen af rækker der skal fyldes i table
        ///    </para>
        /// </param>
        /// <returns>
        ///    void
        /// </returns>
        public static void FillTable(DataTable table, int numberOfRows)
        {
            for(int i=0;i<numberOfRows;i++)
                table.Rows.Add(table.NewRow());
        }
    }
}
Avatar billede snepnet Nybegynder
02. oktober 2004 - 14:35 #18
Altså... med "gode muligheder" mener jeg :

1)
Sørg for at du skruer dine selects sammen så tingene kommer i den rækkefølge du vil have.

2)
Du sørger for at de objekter du benytter som dto-er (dataset, tables, views) har den "rigtige" rækkefølge.

3)
Sørg for at du i forbindelse med præsentationen af data benytter en frontendkontrol hvor du kan styre den slags, eller lav en selv hvor du kan.

Det var vist hovedtrækkene :o)

mvh
Avatar billede snepnet Nybegynder
21. oktober 2004 - 16:34 #19
hej simi... kan vi lukke her ?
(du får lige et svar hvis du kunne bruge noget af det jeg skrev).
mvh
Avatar billede Simon Praktikant
07. november 2004 - 23:43 #20
Tak for rådene. jeg har valgt at løse problemet ved at følge punkt 1, altså at skrue selects sammen så tingene kommer i den rigtige rækkefølge i et DataSet. Dog var spørgsmålet mere hvordan jeg ændrede rækkefølgen EFTER at jeg havde fået samlet et DataSet. Infragistics har en komponent kaldet ultraGrid, hvor man med drag n' drop kan bytte om på kolonner.
Undskyld den lange svartid. men vi har haft travlt i projektet.
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