Avatar billede idiotbarn Nybegynder
05. juli 2005 - 11:29 Der er 17 kommentarer og
1 løsning

Hente bestemt værdi ud fra dataset

Jeg har en side hvor jeg bruger paging vha et datagrid. For jeg ikke skal connecte til databasen hver gang, gemmer jeg dataset'et i en session (er det en ok ide?). I datagrid'et har jeg en hyperlinkcolumn der linker til en side med et bestemt id, fx edit.aspx?Id=2
Grid'et viser også en kolonne der hedder Moduler.

På edit.aspx siden, vil jeg så gerne hente værdien af Moduler(id=2) ud, men da jeg allerede har dataset'et i en session er der ikke nogen grund til at hente fra databasen igen, men kan jeg hive kun den værdi ud af hele dataset'et på denne måde og hvordan?

Jeg har kikket lidt på buttoncolumn, men kan det laves på ovenstående måde?
Avatar billede snepnet Nybegynder
05. juli 2005 - 12:20 #1
hej :o)

hvis du har et dataset i session der indeholder oplysninger (hvilket jeg i mange situationer synes er en fin id'e), og du ønsker at kunne tilgå datasættet fra flere siden kunne du med fordel lave en property i en base f.eks. sådan her:

public class DataPage : Page
{
  protected DataSet PageData
  {
    get{return Session["PageData"] as DataSet;}
    set{Session["PageData"] = value;}
  }
 
  // og måske nogle tabelnavne
  protected static string ModuleTable = "ModuleTable";
}

klasserne for dine andre sider - der tilgår disse data - kan du så definere som følger :

public class ListPage : DataPage
{
}

public class EditPage : DataPage
{
}

du vil fra begge disse sider så kunne tilgå dine data ved
this.PageData

har du på din editeringsside behov for at få fat i en bestemt række - baseret på et id i querystring - kunne du så udvide den med :

public class EditPage : DataPage
{
  public int ItemId
  {
    get{return int.Parse(Request.QueryString["Id"].ToString();}
  }

  private DataRow _currentRow;
  public DataRow CurrentRow
  {
    get
    {
      if(_currentRow == null)
        _currentRow = PageData.Tables[ModuleTable].Select(String.Format("Id={0}", ItemId"));
      return _currenRow;
    }
  }
}

hvad siger du til noget i den stil?
(det er bare skrevet her, så der kan godt være fejl i det... desuden skal du nok lige proppe lidt fejl/null håndtering ind + lave en setter på CurrentRow så du kan skrive til den også :o)

mvh
Avatar billede idiotbarn Nybegynder
06. juli 2005 - 12:51 #2
Hej snepnet...
Jeg hænger vist tydeligvis lidt for meget fast i det gamle asp med hensyn til opbygningen...
Hvis vi starter med at kikke på siden der har datagrid'et og henter fra databasen, hvordan får jeg så ovenstående implementeret, og er metoden jeg har gjort det på "forkert":

<%@ Page Language="C#" %>
<%@ import Namespace="DatabaseConnection" %>
<%@ import Namespace="System.Data" %>
<script runat="server">
public class DataPage : Page
{
  protected DataSet PageData
  {
    get{return Session["PageData"] as DataSet;}
    set{Session["PageData"] = value;}
  }

  // og måske nogle tabelnavne
  protected static string ModuleTable = "ModuleTable";
}




    DBConn DB;
    String getString="Select Id,SiteAddress,User,Modules from Sites order by Id DESC";

        //Hides the column Id, which should not be shown
        void Sites_OnItemDataBound(Object s, DataGridItemEventArgs es){
            es.Item.Cells[1].Visible = false;
        }

      void BindData(){
        DB=new DBConn();
        if(!DB.makeConn())
        {
          DataSet DS=DB.getDataSet(getString);
          DB.closeConn();
          Session["PageData"]=DS;
          Sites.DataSource = DS;
          Sites.DataBind();
        }
        else
        {
          EkstraLabel.Text=DB.getLastError();
          }

        }


        public void Page_Load(Object sender, EventArgs E){
        if(!Page.IsPostBack)
          {
          BindData();
          }
        }

        //get next page
        void myDataGridIsPaged(Object sender , DataGridPageChangedEventArgs e){
        Sites.CurrentPageIndex = e.NewPageIndex;
        Sites.DataSource = Session["PageData"];
        Sites.DataBind();
        }

</script>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
</head>
<body>
    <link href="../Style.css" type="text/css" rel="stylesheet" />
    <script language="JavaScript1.2" src="../MenuInclude.js"></script>
    <img src="../Images/Topbar.gif" />
    <div id="DomainDiv">MasterAdmin
    </div>
    <div id="MenuDiv">
        <!--#Include file="../Menu.asp"-->
    </div>
    <div id="ContentDiv">
        <form runat="server">
            <asp:DataGrid id="Sites" runat="server" HeaderStyle-Font-Bold="True" OnPageIndexChanged="myDataGridIsPaged" PageSize="15" AllowPaging="True" AutoGenerateColumns="True" OnItemDataBound="Sites_OnItemDataBound" CellPadding="5" CellSpacing="0" PagerStyle-Mode="NextPrev" BorderWidth="0">
                <Columns>
                    <asp:TemplateColumn HeaderText="Choose">
                        <ItemTemplate>
                            <a href="Edit.aspx?Id=<%# DataBinder.Eval(Container.DataItem, "Id").ToString()%>">Choose</a>
                        </ItemTemplate>
                    </asp:TemplateColumn>
                </Columns>
            </asp:DataGrid>
        </form>
    </div>
    <div id="EkstraDiv"><asp:Label id="EkstraLabel" runat="server"></asp:Label>
    </div>
</body>
</html>
Avatar billede snepnet Nybegynder
06. juli 2005 - 12:54 #3
hej igen :o)

lige til at starte med - bruger du et udviklingsmiljø, og i givet fald hvilket?

mvh
Avatar billede idiotbarn Nybegynder
06. juli 2005 - 12:56 #4
yes...webmatrix
Avatar billede snepnet Nybegynder
06. juli 2005 - 13:19 #5
ok ... så er det en smule mere besværligt at lave den slags (ikke at det ikke kan lade sige gøre).

meeen ... jeg tror vi dropper det med baseklassen i første omgang, og så må du lave den kode jeg viste dig på begge dine forms.

altså på begge forms for du så en property:

  protected DataSet PageData
  {
    get{return Session["PageData"] as DataSet;}
    set{Session["PageData"] = value;}
  }

og på den side hvor du vil editere det enkelte item får du så:

  public int ItemId
  {
    get{return int.Parse(Request.QueryString["Id"].ToString();}
  }

  private DataRow _currentRow;
  public DataRow CurrentRow
  {
    get
    {
      if(_currentRow == null)
        _currentRow = PageData.Tables[ModuleTable].Select(String.Format("Id={0}", ItemId"));
      return _currenRow;
    }
  }

(og igen - du bør lægge lidt fejlhåndtering ol. ind).

mvh
Avatar billede snepnet Nybegynder
06. juli 2005 - 13:22 #6
du skulle se at hente MS Visual Web Developer, og gå igang med V2.0 ;o)
mvh
Avatar billede idiotbarn Nybegynder
06. juli 2005 - 13:35 #7
prøver jeg lige...har også en ide om at webmatrix ikke er så logisk når man sætter sig ind i det med forskellige lag o.s.v, er ved at installere "web developer express edition Beta 2"
går ud fra det er den eneste der ligger på nettet...
Avatar billede snepnet Nybegynder
06. juli 2005 - 13:38 #8
jeps - den er superfed! - og ja... der er visse muligheder der bliver lidt nemmere at udnytte når man sidder i et miljø der giver en hånd ;o)
mvh
Avatar billede idiotbarn Nybegynder
07. juli 2005 - 01:42 #9
Hey...den tror jeg helt sikkert jeg nok skal blive glad for, har set videoerne igennem, og det ser ret fedt ud...meeeen du skal nok stå standby i denne kategori hvis du vil ha mange point ;)

Jeg har endelig fået MySQL til at køre sammen med VWD, langt om længe, men jeg skal lige ha nogen ting på plads i opbygningen af resten af sitet inden jeg kan gå igang med ovenstående...der går nok lige lidt tid før jeg vender tilbage...tak for hjælpen ind til videre
Avatar billede snepnet Nybegynder
07. juli 2005 - 12:11 #10
velbekomme ... du må jo sige til efterhånden som spørgsmålene dukker op :o)
mvh
Avatar billede snepnet Nybegynder
10. juli 2005 - 10:20 #11
hej igen :o)
vil du have et svar her så vi kan lukke?
- og hvordan går det med VWD? - synes du ikke det er et meget fedt værktøj?
mvh
Avatar billede snepnet Nybegynder
10. juli 2005 - 10:20 #12
og det skulle så have været et svar :o)
mvh
Avatar billede idiotbarn Nybegynder
10. juli 2005 - 20:13 #13
Yes...tak for svaret...Jo, VWD har nogen ret seje funktioner...syntes den producere lidt meget kode en gang i mellem, men sådan er det vel altid.
Det eneste er at det er så besværlig med MySQL, men den er vi jo ved at kikke på i et andet spm ;)
Avatar billede snepnet Nybegynder
11. juli 2005 - 11:33 #14
hej igen - undskyld ventetiden :o(

jeg synes nu ikke det er så fælt det den generer - synes det var værre "i gamle dage".

det er ikke noget problem at bruge mysql i asp.net 2.0 med den eksisterende mysql connector, men det du gerne vil, er at den dukker op i diverse menuer når du vælger at oprette en ny forbindelse o.l. ikke?

mvh
Avatar billede idiotbarn Nybegynder
11. juli 2005 - 23:13 #15
Jo...altså, bruge MySQL som man bruger sqlDataSource... fx med formview, men ellers kan man vel gå uden om og selv gå ind og åbne databasen og binde til forskellige controlls?
Avatar billede snepnet Nybegynder
11. juli 2005 - 23:26 #16
ja det sidste kan du gøre som vanligt... tilføj en reference til dll'en, og lav en
using MySql.Data.MySqlClient

og

MySqlConnection con = new MySqlConnection("Data Source=...");
MySqlCommand command = new MySqlCommand("select * from sometable", con);
MySqlDataAdapter adapter = new MySqlDataAdapter(command);
DataSet ds = new DataSet();
adapter.Fill(ds);

ell.

mvh
Avatar billede idiotbarn Nybegynder
12. juli 2005 - 13:44 #17
ok...man kan også lave formview på samme måde ik? bare med lidt mere programmering? Jeg har ikke lige mulighed for at prøve før om et par dage, det er lige så meget for at vide det
Avatar billede snepnet Nybegynder
12. juli 2005 - 13:50 #18
ci - vi kan skrives ved om det når du sidder ved udviklingsorglet igen :o)
(hvis du har en messengerkonto kan du også lægge den her - så tilføjer jeg dig hos mig)
mvh
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