Avatar billede mema Nybegynder
11. april 2006 - 10:40 Der er 23 kommentarer og
1 løsning

Hvordan kan en database-række vises i en redigerbar formular?

Jeg har 2 formularer og en Access database med 30 felter med en primærnøgle.

Formular1 består af 15 felter. Den sender data til databasen og det virker fint.

Jeg skulle gerne have en ny formular (med alle 30 felter fra databasen). Jeg kan forestille mig at have fx en dataview eller datagrid, der i første omgang viser en tabel med 4-5 felter. Et af disse felter er klikbare, og når man klikker på et link i dette felt, åbnes den tilsvarende række fra databasen i en redigerbar formular. Formularen skulle også består af nogle tekstfelt, nogle tekstområder, nogle radioknapper og nogle dropdownlister.

Jeg bliver glad at få hjælp til fremgangsmåde.
Avatar billede ali.k Nybegynder
11. april 2006 - 10:51 #1
Så vidt jeg husker kan du højreklikke på din Dataview eller Datagrid og tilføje muligheden for at folk kan redigere i din e Dataviwe eller Datagrid.
Avatar billede mema Nybegynder
11. april 2006 - 11:39 #2
Jeg tror du har misforstået mit spørgsmål. Den første fx datagrid (som jeg ikke oprettet endnu) skulle have et felt som linker til en webfrom og denne webform skulle være redigerbart, dvs de første 15 felter skulle være udfyldt med data fra databasen (vedr. netop denne række) og resterende felter (15 stk.) skulle være tømt, sådan at man kan udfylde dem og sender dem til databasen.
Det er også OK hvis de første 15 felter viser data i nogle label og ikke er redigerbart.
Avatar billede snepnet Nybegynder
11. april 2006 - 15:43 #3
det er sådan en typisk master/detail løsning du er ude efter ikke?
bruger du 1.1 eller 2.0 (og har du mulighed for det sidste, hvis du ikke allerede bruger det).
mvh
Avatar billede mema Nybegynder
11. april 2006 - 17:00 #4
Jeg bruger 1.1 og har desværre ikke mulighed for 2.0.
Avatar billede mema Nybegynder
11. april 2006 - 17:01 #5
Du må gerne fortælle mig hvad en master/detail løsning er?
Avatar billede mema Nybegynder
02. maj 2006 - 22:22 #6
Jeg lukker:-(
Avatar billede snepnet Nybegynder
03. maj 2006 - 00:16 #7
Jeg beklager meget ... jeg har misset denne her - sorry :o(

Først vil jeg anbefale dig - såfremt det nu er blevet muligt for dig - at begynde at bruge version 2.0, da der ligger langt bedre værktøjer til den slags scenarier i den version.

Du kan klart nok også lave det i 1.1, og principperne er ikke så forskellige.

Din masterside - altså den der viser den store liste - kan du basere på f.eks. et datagrid (det er det nemmeste som udgangspunkt), og benytte dig af databinding.
Dette indebærer at du laver noget som dette i din kode (grid er id'et på det datagrid du så har indsat på siden):

protected void Page_Load(object sender, EventArgs e)
{
  // håndtering af databinding
  if (!IsPostBack)
  {
    BindGrid();
  }
}

// databinding
private void BindGrid()
{
  grid.DataSource = GetData();           
  grid.DataBind();
}

// tilvejebringelse af data
private DataTable GetData()
{
  // spørg hvis du er i tvivl om hvordan du suger data fra databasen
}

du kan så indsætte et link i griddet sådan her:
<asp:HyperLinkColumn DataNavigateUrlField="PersonId" DataNavigateUrlFormatString="Details.aspx?PersonId={0}" Text="Redigér"></asp:HyperLinkColumn>

Det renderes som et almindeligt link - f.eks. sådan her
<a href="Details.aspx?PersonId=27">Redigér</a>

Du laver så også en details-side, hvor du som udgangspunkt (i 1.1) ikke har særlige kontroller der kan komme dig til hjælp, så der sætter du bare siden op som du synes den skal se ud - og sætter de respektive værdier manuelt:

protected void Page_Load(object sender, EventArgs e)
{
  if (!IsPostBack)
  {
    InsertPersonValues();
  }
}

private void InsertPersonValues()
{
  // først høster du data
  // her sætter du manuelt properties på dine kontroller
  DataRow personData = GetPersonData();
  this.txtName = (string)personData["Name"];
  this.txtAge = (int)personData["Age"];
  ...
}

// tilvejebringelse af data - et datarow for eksemplets skyld
private DataRow GetPersonData()
{
  // her henter du dine data - baseret på din querystringparameter PersonId
  int personId = int.Parse(Request.QueryString["PersonId"]);
  // hent data baseret på id'et og returner (datarow for eksemplet)
  return datarow;
}

Desuden må du så have en art opdaterings-knap på siden, hvor du i handleren må hive brugerens indtastninger ud af kontrollerne - og opdatere databasen med værdierne.

Der er mange måder at lave den slags sager på - og også masser af huller i den forklaring du har fået her, men du må spørge hvis der skulle være noget.

Du kan hente en løsning med forskellige eksempler her. Den siden (med tilhørende kode) der hedder PersonsDataGrid kunne være et udgangspunkt.
http://www.microsoft.com/downloads/details.aspx?FamilyID=3f0aa1ee-8041-4ec1-9141-3f83d0bcbd62&displaylang=da

mvh
Avatar billede mema Nybegynder
04. maj 2006 - 11:33 #8
Tak for svaret. Jeg skal nok arbejde på det.
Men jeg havde et spørgsmål: Giver det mening at installere .NET 2/ASP.NET 2.0 når man har kun VS 2003 til rådighed?
Avatar billede snepnet Nybegynder
04. maj 2006 - 12:01 #9
nej - ikke rigtig, men der findes gratisværktøjer til 2.0:
http://msdn.microsoft.com/vstudio/express/default.aspx
mvh
Avatar billede mema Nybegynder
04. maj 2006 - 19:41 #10
Nu var det for langt tid siden jeg installerede VS og SQL-server (2000). Jeg ville gerne også spørge om efter installation af ASP.NET 2.0 og VS 2005 kan man beholde SQL-server 2000 eller skal SQL-serveren først fjernes og installeres igen (2000 eller 2005)?
Avatar billede mema Nybegynder
04. maj 2006 - 20:20 #11
Tja,
Jeg er begyndt med Page_Load(...
Masterside.aspx.cs er sådan ud:
---------
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;
using System.Data.OleDb;

namespace EkspertenDk
{
public class Masterside : System.Web.UI.Page
{
protected System.Web.UI.WebControls.DataGrid grid;
   
protected void Page_Load(object sender, EventArgs e)
{
// håndtering af databinding
if (!IsPostBack)
{
BindGrid();
}
}

// databinding
private void BindGrid()
{
grid.DataSource = GetData();         
grid.DataBind();
}

// tilvejebringelse af data
private DataTable GetData()
{
// spørg hvis du er i tvivl om hvordan du suger data fra databasen
string connStr = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + MapPath("Data/Files.mdb");
OleDbConnection conn = new OleDbConnection(connStr);

OleDbDataAdapter da = new OleDbDataAdapter("select PersonaleID, Stillingsnavn, Stillingstype, Institution from Personale ORDER BY PersonaleID DESC", conn);

DataSet ds = new DataSet();
da.Fill(ds, "Personale");

grid.DataSource=ds;
grid.DataBind();
return Tables["Personale"].DefaultView;
}

#region Web Form Designer generated code
.....
#endregion
}
}
-----
Jeg få fejlmeddelelse ved: return Tables[.... Så jeg har faktisk problem ved at trække data fra Access-databasen.
Avatar billede mema Nybegynder
04. maj 2006 - 23:04 #12
Jeg tror at have fået styr på "private DataTable GetData":
....
public class Masterside : System.Web.UI.Page
{
protected System.Web.UI.WebControls.DataGrid grid;
   
protected void Page_Load(object sender, EventArgs e)
{
// håndtering af databinding
if (!IsPostBack)
{
BindGrid();
}
}

// databinding
private void BindGrid()
{
grid.DataSource = GetData();         
grid.DataBind();
}

// tilvejebringelse af data
private DataTable GetData()
{
// spørg hvis du er i tvivl om hvordan du suger data fra databasen
string strConn, strCmd;
strConn = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + MapPath("Data/Files.mdb");
strCmd = "SELECT PersonaleID, Stillingsnavn, Stillingstype, Institution FROM Personale";
OleDbDataAdapter oCMD = new OleDbDataAdapter(strCmd, strConn);
DataSet oDS = new DataSet();
oCMD.Fill(oDS, "Personale");
DataTable dt = oDS.Tables["Personale"];
return dt;
}
...
Avatar billede snepnet Nybegynder
05. maj 2006 - 08:17 #13
ja - det var et dataview du returnerede fra den anden (de kan nu også være helt fine i flere sammenhænge).
du kan godt have flere installationer af sql-servere installeret, også selvom den ene er en express.
Avatar billede mema Nybegynder
05. maj 2006 - 12:04 #14
Hej snepnet,
Jeg skulle faktisk tildele dig 100 points. Hvordan gør jeg det, nu at jeg har lukket for denne spørgsmål?
I øvrigt min ovenstående aspx-fil (Masterside.aspx.cs) virker, bortset fra at når man klikker på "Rediger" får jeg fejlmeddelelse: "Could not load type 'EkspertenDk.Details'."
Jeg har også oprettet en anden webform (Details.aspx) og oprettet 3 tekstbokse. Men det kommer med en fejl: Cannot implicitly convert type 'int' to 'System.Data.DataRow'.

Selve Details.aspx.cs ser sådan ud:
------------------
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 EkspertenDk
{
public class Details : System.Web.UI.Page
{
protected System.Web.UI.WebControls.TextBox txtStillingsnavn;
protected System.Web.UI.WebControls.TextBox txtStillingstype;
protected System.Web.UI.WebControls.TextBox txtInstitution;
   
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
InsertPersonValues();
}
}

private void InsertPersonValues()
{
// først høster du data
// her sætter du manuelt properties på dine kontroller
DataRow personaleData = GetPersonaleData();
this.txtStillingsnavn.Text = (string)personaleData["Stillingsnavn"];
this.txtStillingstype.Text = (string)personaleData["Stillingstype"];
this.txtInstitution.Text = (string)personaleData["Institution"];
}

// tilvejebringelse af data - et datarow for eksemplets skyld
private DataRow GetPersonaleData()
{
// her henter du dine data - baseret på din querystringparameter PersonaleID
            int personaleID = int.Parse(Request.QueryString["PersonaleID"]);
// hent data baseret på id'et og returner (datarow for eksemplet)
//    return datarow;
return (int)personaleID;
}

#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
InitializeComponent();
base.OnInit(e);
}
/// <summary>
private void InitializeComponent()
{   
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
}
-----------
jeg vil meget gerne få hjælp...
Avatar billede snepnet Nybegynder
05. maj 2006 - 12:42 #15
Halløjsa ... Jeg tror ikke man kan genåbne et spørgsmål, så eneste mulighed er vist at oprette et nyt hvor man henviser til det gamle.

Mht. de fejl du får... Kan du så ikke lige vise mig aspx-koden for de to sider?

Mvh
Avatar billede snepnet Nybegynder
05. maj 2006 - 12:43 #16
Du er også velkommen til at smide din emailadresse her - så skriver jeg til dig, og du kan sende et projekt med filerne i til mig.
Mvh
Avatar billede snepnet Nybegynder
05. maj 2006 - 12:43 #17
Hvorfor kan du for øvrigt ikke skifte til 2.0?
Mvh
Avatar billede mema Nybegynder
05. maj 2006 - 13:12 #18
Jeg har oprettet et spørgsmål med henvisning til dette: http://www.eksperten.dk/spm/707486

------------
Min e-mail er: mehmah@gmail.com
------------

Her kommer de to aspx-filer:
Masterside.aspx:
-----
<%@ Page language="c#" Codebehind="Masterside.aspx.cs" AutoEventWireup="false" Inherits="EkspertenDk.Masterside" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>Masterside</title>
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<asp:datagrid id="grid" style="Z-INDEX: 101; LEFT: 48px; POSITION: absolute; TOP: 64px" runat="server" Font-Size="X-Small" Font-Names="Verdana" Width="600px" AutoGenerateColumns="False">
<HeaderStyle BackColor="#C0C0FF"></HeaderStyle>
<Columns>
<asp:HyperLinkColumn DataNavigateUrlField="PersonaleId" DataNavigateUrlFormatString="Details.aspx?PersonId={0}" Text="Redigér">
</asp:HyperLinkColumn>
<asp:BoundColumn DataField="PersonaleID" HeaderText="ID"></asp:BoundColumn>
<asp:BoundColumn DataField="Stillingsnavn" HeaderText="Stillingsnavn"></asp:BoundColumn>
<asp:BoundColumn DataField="Stillingstype" HeaderText="Stillingstype"></asp:BoundColumn>
<asp:BoundColumn DataField="Institution" HeaderText="Institution"></asp:BoundColumn>
</Columns>
</asp:datagrid></form>
</body>
</HTML>

Og Details.aspx:
----
<%@ Page language="c#" Codebehind="Details.aspx.cs" AutoEventWireup="false" Inherits="EkspertenDk.Details" %>
<HTML>
<HEAD>
<title>Details</title>
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<TABLE id="Table1" style="Z-INDEX: 104; LEFT: 56px; POSITION: absolute; TOP: 80px" cellSpacing="0" cellPadding="5" width="700" border="0">
<TR>
<TD width="100"></TD><TD width="150"></TD><TD width="250"></TD><TD width="200"></TD>
</TR><TR>
<TD width="100"></TD><TD width="150">Stillingsnavn:</TD>
<TD width="250"><asp:TextBox id="txtStillingsnavn" runat="server"></asp:TextBox></TD>
<TD width="200"></TD></TR>
<TR><TD width="100"></TD><TD width="150">Stillingstype:</TD><TD width="250">
<asp:TextBox id="txtStillingstype" runat="server"></asp:TextBox></TD>
<TD width="200"></TD></TR>
<TR><TD width="100"></TD><TD width="150">Institution:</TD><TD width="250">
<asp:TextBox id="txtInstitution" runat="server"></asp:TextBox></TD>
<TD width="200"></TD></TR>
<TR><TD width="100"></TD><TD width="150"></TD><TD width="250"></TD>
<TD width="200"></TD></TR>
</TABLE>
</form>
</body>
</HTML>
Avatar billede mema Nybegynder
05. maj 2006 - 13:20 #19
Er Express version 2005 lige so god som almindelig (Architect) version 2003?
Jeg bliver også glad at høre hvad rækkefølge af installationerne er. Er det:
- .NET 2.0 Prerequisites
- .NET 2.0
- Aktivering af ASP.NET (hvordan?)
- Installation af Visual Web Developer 2005 Express
- Installation af SQL-server (jeg går ud fra at ikke afinstallere den gamle fordi jeg har nogle databaser liggende og umiddelbart ved ikke hvordan skal man lave backup)
Avatar billede arne_v Ekspert
05. maj 2006 - 13:31 #20
bedre på nogen områder (2005 verss 2003) - dårligere på andre områder (Express versus Architect)

SQLServer 2000 og 2005 kan godt sameksistere på samme system

aktivering plejer at ske automatisk men ellers aspnet_regiis

jeg ville nok installere SQLServer inden VS men jeg tror ikke at det betyder
noget
Avatar billede snepnet Nybegynder
05. maj 2006 - 13:35 #21
Visual Web Developer 2005 Express er et lang federe værktøj at lave ASP.NET løsninger i end VS2003 (hvis du spørger mig).

Jeg mener at rækkefølgen er:
Installér Visual Web Developer - så fikser den resten :o)

Du får dog så muligheden for at angive på et website (under iis'en) om det skal være et 2.0, eller et 1.1 site (vælger du 2.0 får du nogle ekstra konfigurationsmuligheder).
Som udgangpunkt behøver du ikke oprette et site på IIS'en for at arbejde med webprojekter når du benytter de nye værktøjer.

Dit link her:
<asp:HyperLinkColumn DataNavigateUrlField="PersonaleId" DataNavigateUrlFormatString="Details.aspx?PersonId={0}" Text="Redigér">

Der kalder du med PersonId= og på din detailsside gør du sådan her:
int personaleID = int.Parse(Request.QueryString["PersonaleID"]

PersonId / PersonaleId ... den skal i hvert fald rettes.

Jeg kigger lidt mere på det når jeg får det pr. mail.

mvh
Avatar billede snepnet Nybegynder
05. maj 2006 - 13:38 #22
Installation af VWD medfører pr. default en installation af Sql Server 2005 Express.
mvh
Avatar billede snepnet Nybegynder
05. maj 2006 - 17:34 #23
Du kan lave sådan noget her på din detailsside:
(lidt diverse fejlhåndtering får du brug for - men du kan jo gå videre med nedenstående).
Mvh

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        InsertPersonValues();
    }
}

private void InsertPersonValues()
{
    using (OleDbConnection connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + MapPath("Data/Files.mdb")))
    using (OleDbCommand command = new OleDbCommand("SELECT PersonaleID, Stillingsnavn, Stillingstype, Institution FROM Personale where PersonaleID = @PersonaleID", connection))
    {
        command.Parameters.Add("@PersonaleID", typeof(int));
        command.Parameters["@PersonaleID"].Value = int.Parse(Request.QueryString["PersonaleID"]);
        command.Connection.Open();
        using (OleDbDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection))
        {
            if (reader.Read())
            {
                txtStillingsnavn.Text = reader.GetString(reader.GetOrdinal("Stillingsnavn"));
                txtStillingstype.Text = reader.GetString(reader.GetOrdinal("Stillingstype"));
                txtInstitution.Text = reader.GetString(reader.GetOrdinal("Institution"));
            }
        }
    }
}
Avatar billede mema Nybegynder
05. maj 2006 - 17:51 #24
Det kører fint og viser data i tekstboksene, men der skulle være også et knap, hvor man efter at have ændret noget, kunne opdatere posterne.
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