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
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.
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 ;-)
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;
//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);
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;
//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; }
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.
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 :
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(); }
/// <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(); }
/// <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()); } } }
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.
Synes godt om
Ny brugerNybegynder
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.