Avatar billede cogitans Nybegynder
05. juli 2004 - 17:33 Der er 132 kommentarer og
1 løsning

Mousedown i webapplikation

Hvordan kalder man metoden "mousedown" i en webaplikation?
Når mousedown'en kaldes, så skal der sættes en linie ind i en database på serveren. Dette sker gennem en instans af en klasse, som oprettes i aspx-filen. Mousedown'en er så en metode i codebehindfilen til den aktuelle aspxfil...?
Avatar billede snepnet Nybegynder
05. juli 2004 - 17:40 #1
Hej - lige et par spørgsmål. Hvad er det folk skal kunne trykke på med musen ? Og.. hvilket udviklingsmiljø bruger du ?
(det sidste er bare for at høre hvad du eventuelt kan få foræret af miljøet)
Avatar billede cogitans Nybegynder
05. juli 2004 - 18:28 #2
Folk trykker på et link. Bl.a. dette links navn skal så gemmes i databasen.
Jeg prøgramerer i C# i Visual Studio. Selve aspx-filen er skrevet i VB-script. Men derfor kan jeg vel godt programere codebehindfilen i C#?
Avatar billede snepnet Nybegynder
05. juli 2004 - 18:57 #3
Hvis du i visual studio trækker en LinkButton (ligger under Web Forms i toolboxen) ind på din form og dobbeltklikker på den, så genererer visual studio en handler til det event i koden, og sørger for at knappen kalder den handler hvis der klikkes på den.
Du vil så kunne se dels i din aspx-fil, og dels i din codebehind, hvordan man vanligvis implementerer den slags.
Du kan stadig lave en onmousedown="<whatever>" clientside, men hvis du i handleren vil skrive til dabaser mv. vil jeg nok anbefale at du gør det serverside.
Avatar billede snepnet Nybegynder
05. juli 2004 - 18:57 #4
(Jeg er først tilbage om nogle timer igen)
Avatar billede cogitans Nybegynder
05. juli 2004 - 20:18 #5
Ja, jeg foretrækker nok også, at et foregår serverside. Men clientside er vel også i orden...man kan vel bare løse det med komplette URL'er (hele stien/URL'en til databasen).
Hvordan skal hele metodehoveet (minus implementeringen) skrives til en inmousedown?
Avatar billede cogitans Nybegynder
05. juli 2004 - 21:05 #6
Hvis jeg benytter LinkButton, så skal jeg skrive noget kode ve hvert link. Og linkkoden er jo skrevet i VBscript...så den går vist ikke rigtigt. Desuden vil det vel være næmere at lave en mousedownhandler, da jeg så kun skal skrive 1 metode til at klare alle mulighederne. Jeg har fundet 1 mulighed:

protected override void OnMouseDown(MouseEventArgs e) {
  base.OnMouseDown(e);
  if (!allowUserEdit) {
      return;
  }
  Capture = true;
  dragging = true;
  SetDragValue(new Point(e.X, e.Y));
}

Jeg kan bare ikke få denne løsnng til at fungere. Jeg skal vist nedarve fra en klasse. Men hvilken klasse er dette, og hvordan skal jeg helt nøjagtig gøre det?
Avatar billede snepnet Nybegynder
06. juli 2004 - 10:30 #7
Kan jeg ikke få dig til at poste hele aspx-filen her - jeg er en smule usikker på hvad det er du har lavet.
Avatar billede cogitans Nybegynder
06. juli 2004 - 11:17 #8
<%@ Page Language="VB" Debug="True" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Math" %>
<SCRIPT language="VB" runat="server">
Private lsTitle as String
Public Sub Page_Load(obj as object, e as eventargs)
    lsTitle = Request("title")
    If lsTitle = "" Then lsTitle = "Ftp browser"
End Sub
Public Sub RptErr(psMessage)
    Response.Write("<DIV align=""left"" width=""100%""><B>Script Reported Error</B><BR>Message: " & psMessage & "</DIV><BR>")
End Sub
</SCRIPT>
<HTML><HEAD><TITLE><%=lsTitle%></TITLE>
<STYLE>
BODY{font-family:tahoma;font-size:9pt;}
TABLE{border-collapse:collapse;border:1px inset #606060;}
TD{border:1px solid #606060;font-family:tahoma;font-size:9pt;}
H1{margin-bottom:1px;font-family:vendara,tahoma;font-size:12pt;color:#202020;}
A{font-family:tahoma;font-size:9pt;color:#3C6B96;}
.tdDir{border:0px;font-family:tahoma;font-size:9pt;color:#202020;background-color:#EFEFEF;}
.tdFile{border:0px;font-family:tahoma;font-size:9pt;color:#202020;background-color:#FAFAFA;}
.tdhead{border:0px;font-family:tahoma;font-size:9pt;color:#ffffff;background-color:#3C6B96;}
.tdheadA{border:0px;font-family:tahoma;font-size:9pt;color:#eeeeee;background-color:#3C6B96;}
</STYLE>
</HEAD><BODY bgcolor="#e7e7ef">
<%
    Try
        Dim sScriptName as String, i as Long, sSubDir as String, j as Integer
        Dim sPrevLink as String, iLen as Double, sLen as String
        Dim sLink as String = Request("link")

        Response.Cache.SetExpires(DateTime.Now.AddHours(24))
        Response.Cache.SetCacheability(HttpCacheability.Public)

        Response.Write("<CENTER><H1>" & lsTitle & "</H1>")
        If sLink <> "" Then
            Response.Write("<A href=""" & sLink & """>[&nbsp;Return&nbsp;]</A><BR>")
        End If

        sSubDir = Replace(Request("path"),"\","/")
        If Left$(sSubDir,1) <> "/" Then sSubDir = "/" & sSubDir
        If Right$(sSubDir,1) <> "/" Then sSubDir = sSubDir & "/"

        sScriptName = LCase(Request.ServerVariables("SCRIPT_NAME"))
        j = InStrRev(sScriptName,"/")
        If j > 0 Then sScriptName = Right$(sScriptName,Len(sScriptName)-j)

        If sSubDir = "/" Then
            sPrevLink = sPrevLink & "/root/"
        Else
            sPrevLink = sPrevLink & "/<A class=""tdheadA"" href=""" & sScriptName & "?path=&title=" & lsTitle & "&link=" & sLink & """>root</a>/"
        End If
        j = 1
        Do
            i = InStr(j + 1,sSubDir,"/")
            If i < 1 Then Exit Do
            If i = Len(sSubDir) Then
                sPrevLink = sPrevLink & Mid$(sSubDir, j+1, (i-j)-1) & "/"
            Else
                sPrevLink = sPrevLink & "<A class=""tdheadA"" href=""" & sScriptName & "?path=" & Trim(Mid$(sSubDir, 1, i-1)) & "&title=" & lsTitle & "&link=" & sLink & """>" & Mid$(sSubDir, j+1, (i-j)-1) & "</a>/"
            End If
            j = i
        Loop

        Dim oDirInfo As New DirectoryInfo(Server.MapPath("") & Replace(sSubDir,"/","\"))
        Dim oFiles As FileInfo() = oDirInfo.GetFiles()
        Dim oDirs As DirectoryInfo() = oDirInfo.GetDirectories()
        Dim oDir As DirectoryInfo, oFile As FileInfo

        Response.Write("<BR><table cellpadding=3 cellspacing=1 width=""100%""><tbody>")
        Response.Write("<tr><td colspan=4 class=""tdhead"">&nbsp;Address: &nbsp;" & sPrevLink & "</td></tr>")
        Response.Write("<tr><td width=""100%"" class=""tdhead"">&nbsp;Directory Name&nbsp;</td><td width=""40px"" class=""tdhead"">&nbsp;Type&nbsp;</td><td class=""tdhead"" width=""140px"" nowrap>&nbsp;Last Write&nbsp;</td><td class=""tdhead"" width=""100px"" align=""right"" nowrap>&nbsp;Details&nbsp;</td></tr>")

        For Each oDir In oDirs
            Try
                Response.Write("<tr><td class=""tdDir""><a href=""" & sScriptName & "?path=" & sSubDir & oDir.Name & "&title=" & lsTitle & "&link=" & sLink & """>" & oDir.Name & "</a></td><td class=""tdDir"">Dir</td><td class=""tdDir"" align=""right"">" & oDir.LastWriteTime & "</td><td class=""tdDir"" align=""right"">" & oDir.GetFiles().Length & " files</td></tr>")
            Catch ex as Exception
                Response.Write("<tr><td class=""tdDir"">" & oDir.Name & " (Access Denied)</td><td class=""tdDir"">Dir</td><td class=""tdDir"" align=""right"">" & oDir.LastWriteTime & "</td><td class=""tdDir"" align=""right"">? files</td></tr>")
            End Try
        Next oDir

        For Each oFile In oFiles
            If Not (LCase(oFile.Name) = sScriptName and sSubDir = "/") Then
                iLen = oFile.Length
                If iLen >= 1048960 Then
                  sLen = Round(iLen / 1048960,2) & " mb"
                Else
                  sLen = Round(iLen / 1024,2) & " kb"
                End If
                Response.Write("<tr><td class=""tdFile""><a href=""" & Right$(sSubDir,Len(sSubDir)-1) & oFile.Name & """>" & oFile.Name & "</a></td><td class=""tdFile"">File</td><td class=""tdFile"" align=""right"">" & oFile.LastWriteTime & "</td><td class=""tdFile"" align=""right"">" & sLen & " </td></tr>")
            End If
        Next oFile

        Response.Write("</tbody></table></center><br>")
    Catch ex as Exception
        RptErr(ex.Message)
    End Try

%>
</BODY></HTML>

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 New;

namespace New
{
    /// <summary>
    /// Summary description for Browse.
    /// </summary>
    public class Browse : System.Web.UI.Page
    {
          public New.DatabaseFtpManagement a;

        private void Page_Load(object sender, System.EventArgs e)
        {
            // Put user code to initialize the page here
        }

        protected override void OnMouseDown(MouseEventArgs e)
        {
            a=new New.DatabaseFtpManagement();
            a.run(this);
        }

        #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>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {   
            this.Load += new System.EventHandler(this.Page_Load);
        }
        #endregion
    }
}
Avatar billede cogitans Nybegynder
06. juli 2004 - 13:35 #9
Kan man ikke bare override onmoussedownmetoden:
[C#]
protected virtual void OnMouseDown(
  MouseEventArgs e
);
?
Avatar billede snepnet Nybegynder
06. juli 2004 - 15:57 #10
Du må undskylde at jeg ikke har ladet høre fra mig. Jeg er på arbejde, men kommer self. hjem senere, og så skal jeg nok kigge nærmere på det.
Avatar billede snepnet Nybegynder
06. juli 2004 - 16:53 #11
Hmmm.... Det ser lidt specielt ud det du har lavet. Umiddelbart er det en vanlig asp-side, og en uafhængig C#-fil, som det ikke burde kunne lade sig gøre at kompilere.
Dels er der ingen metode på System.Web.Ui.Page der hedder OnMouseDown, og MouseEventArgs er vist defineret i System.Windows.Forms, som ikke er refereret.

Er der nogen speciel årsag til at du laver dine sider i ASP, og ikke i ASP.NET ?

Hvis du er interesseret kan jeg godt lave et lille eksempel på hvordan det kunne se ud i .NET, og jeg vil gerne kigge på det her lidt senere i aften, hvis det skulle være.

Mvh
Avatar billede cogitans Nybegynder
06. juli 2004 - 21:03 #12
Filen hedder "aspx" som endelse...så kan det godt være en almindelig asp-fil og ikke en asp.net?
Grunden til at den er i det sprog er, at det er en fil, som jeg har fundet på nettet. Den tilhørende aspc.cs-fil har jeg så selv lavet. Jeg ved ikke om det fungerer...jeg tvivler næsten på det, da filerne er placeret i andre bibliotekker en projektbibliotekket.

Tak for tilbuddet om .net-udgaven. Hvis funktionalitetten er den samme, så vil jeg da gerne have løsningen i .net-udgaven. Men p.t. er problemet bare mousedown-funktionen. Så hvis den eneste løsning på det problem er en .net-fil - then be it! ;-)
Avatar billede cogitans Nybegynder
06. juli 2004 - 21:09 #13
..tjo, forresten: det skal vel være en .net-udgave, hvis jeg skal oprette indstanser c# inde i filen?
Avatar billede snepnet Nybegynder
06. juli 2004 - 21:29 #14
Ja det vil være klart det nemmeste... Du får et lille oplæg her om 10-15 minutter - ok ?
Avatar billede cogitans Nybegynder
06. juli 2004 - 22:07 #15
Ja, hvis det er 1, hvor der er MEGET af funktionalitetten i, så vil jeg være dig MEGET taknemmelig.
Avatar billede snepnet Nybegynder
06. juli 2004 - 22:25 #16
Du får lige noget at starte op med i første omgang... Det er bare en lille smagsprøve :o)
Avatar billede snepnet Nybegynder
06. juli 2004 - 22:25 #17
// først aspx-filen :

<%@ Page language="c#" Codebehind="DirectoryBrowser.aspx.cs" AutoEventWireup="false" Inherits="cogitans.DirectoryBrowser" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
    <HEAD>
        <title>DirectoryBrowser</title>
        <meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
        <meta content="C#" name="CODE_LANGUAGE">
        <meta content="JavaScript" name="vs_defaultClientScript">
        <meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
    </HEAD>
    <body>
        <form id="Form1" method="post" runat="server">
            <asp:table id="tblFileView" runat="server" Font-Names="Verdana" CellSpacing="0" CellPadding="1"
                BorderColor="Gray" BorderWidth="1px" BorderStyle="Solid" GridLines="Both" Font-Size="XX-Small">
                <asp:TableRow ForeColor="#000040" BackColor="#FFFFC0" Font-Bold="True">
                    <asp:TableCell Text="ItemName"></asp:TableCell>
                    <asp:TableCell Text="Creation DataTime"></asp:TableCell>
                </asp:TableRow>
            </asp:table></form>
    </body>
</HTML>
Avatar billede snepnet Nybegynder
06. juli 2004 - 22:26 #18
// og så C# filen :

using System;
using System.IO;
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 cogitans
{
    public class DirectoryBrowser : System.Web.UI.Page
    {
        protected Table tblFileView;
   
        private void Page_Load(object sender, System.EventArgs e)
        {           
            AddDirectoryView(Request.PhysicalApplicationPath);
        }

        // metode til at smide rækkerne ind i tabellen
        public void AddDirectoryView(string path)
        {
            // først indsættes rækker for alle direktories i path
            string[] items = Directory.GetDirectories(path);           
            foreach (string s in items)
            {
                AddItem(new DirectoryInfo(s));
            }

            // derefter rækker for alle filer
            items = Directory.GetFiles(path);           
            foreach (string s in items)
            {
                AddItem(new FileInfo(s));
            }
        }

        // metode til at smide en enkelt række ind i tabellen
        private void AddItem(FileSystemInfo itemInfo)
        {
            tblFileView.Rows.Add(CreateItemRow(itemInfo));           
        }

        // metode til at danne en række
        private TableRow CreateItemRow(FileSystemInfo itemInfo)
        {
            TableRow tr = new TableRow();           

            // lidt farveværk
            if(itemInfo is DirectoryInfo)
                tr.BackColor = Color.LightBlue;
               
            // en linkbutton så man kan klikke på fil/dir navnet
            LinkButton lbtn = new LinkButton();
            lbtn.Click += new EventHandler(lbtn_Click);
            lbtn.Text = itemInfo.Name;
            lbtn.CommandArgument = itemInfo.FullName;
            lbtn.Style.Add("text-decoration","none");

            // ind med knappen
            tr.Cells.Add(CreateItemCell(lbtn));

            // ind med en ekstra oplysning
            tr.Cells.Add(CreateItemCell(new LiteralControl(itemInfo.CreationTime.ToString())));           

            return tr;
        }

        // metode til at danne en enekelt celle
        private TableCell CreateItemCell(Control content)
        {
            TableCell tc = new TableCell();
            tc.Controls.Add(content);
            return tc;
        }

        // håndtering af click-event fra knappen - CommandArgument skulle så gerne indeholde den fulde sti
        private void lbtn_Click(object sender, EventArgs e)
        {
            string selectedPath =  ((LinkButton)sender).CommandArgument;
        }

        override protected void OnInit(EventArgs e)
        {
            InitializeComponent();
            base.OnInit(e);
        }
       
        private void InitializeComponent()
        {   
            this.Load += new System.EventHandler(this.Page_Load);

        }
    }
}
Avatar billede snepnet Nybegynder
06. juli 2004 - 22:28 #19
Den slags kan laves på 100 forskellige måder... Men nu har du i hvert fald en lille blanding af en serverkontrol (tabellen), og lidt dynamisk opbygning af en tabel i kode + lidt eventhåndtering.
Avatar billede snepnet Nybegynder
06. juli 2004 - 22:30 #20
Det er jo så der hvor der står :
string selectedPath =  ((LinkButton)sender).CommandArgument;
At du kan fyre din egen kode af.
Avatar billede cogitans Nybegynder
07. juli 2004 - 11:38 #21
I aspxfilen: skal der står 'Inherits="cogitans.DirectoryBrowser" '? Ahh...'cogitans' er namespacet eller hva?
Skal der ligge en aspx- og cs-fil i hvert aktuelt bibliotek for at det fungerer? Jeg har på fornemmelsen, at man ikke skal kalde filerne med noget argument, men at argumentet automatisk bliver stien hvortil filen ligger?
Avatar billede snepnet Nybegynder
07. juli 2004 - 12:03 #22
Ja - det er namespacet.
Der skal ikke nødvendigvis ligge begge dele, men når du opretter en ny form i visual studio får du det automatisk (faktisk får du tre).
Jeg fårstår ikke helt hvad du mener med det sidste... Det med at kalde filer med eller uden argument.
Avatar billede cogitans Nybegynder
07. juli 2004 - 12:35 #23
Med argument mener jeg:
"
private void Page_Load(object sender, System.EventArgs e)
        {           
            AddDirectoryView(Request.PhysicalApplicationPath);
        }
"
argumentet er så: "Request.PhysicalApplicationPath" ?
Det er en bug i mit Visual Studio. Når jeg tilføjer en ny form går hele programet ned. Men jeg kan komme om ved problemet ved at kopiere en aspx-fil fra projektet ind i samme projekt og så omdøbe lidt. Så jeg får ikke nogle valgmuligheder...faktisk er jeg ikke helt med på, hvad det er for nogle valgmuligheder, du snakker om?
Avatar billede cogitans Nybegynder
07. juli 2004 - 12:48 #24
Jeg ved ikke, om det har noget med det argument, som jeg snakkede om, at gøre, men når jeg kører det, så kommer der kun dette frem i nogle kasser:

ItemName Creation DataTime

Det er vel tabelhovedet. Men indholdet af tabellen mangler. Ved du, hvorfor der ikke er noget i tabellen?
Avatar billede cogitans Nybegynder
07. juli 2004 - 12:49 #25
Ah, der er sket en fejl i min programering...øjeblik...
Avatar billede cogitans Nybegynder
07. juli 2004 - 12:54 #26
Ja, for s.... Nu har jeg da noget i tabellen. NU skal jeg lige have tid til at nærstudere et ;-)
Avatar billede cogitans Nybegynder
07. juli 2004 - 13:19 #27
Tjo, det ser skam godt ud. Men der mangler bare noget funktionalittet:
-Når man klikker på en fil, så får man ikke muligheden for at downloade den - det var jo meningen.
-Når man klkker på et bibliotek, så ryger man ikke ind i det aktuelle bibliotek, og får en ny liste over indholdet i det aktuelle bibliotek.
Ved du hvordan man konstruerer disse funktionalitetter?
Avatar billede cogitans Nybegynder
07. juli 2004 - 14:19 #28
Jeg har nu løst problemet med at downloade en fil. Det er gjort således:

private void lbtn_Click(object sender, EventArgs e)
{
  string selectedPath =  ((LinkButton)sender).CommandArgument;
    Response.Redirect(selectedPath);
}

Men man kan stadig ikke gå et trin videre ind gennem en mappe. Jeg har forsøgt med:

private void lbtn_Click(object sender, EventArgs e)
{
    string selectedPath =  ((LinkButton)sender).CommandArgument;
    if (selectedPath=selectedPath.GetType){
    //send et bibliotek videre ind i path
             
    }
    Response.Redirect(selectedPath);
}

men jeg mangler en metode, hvorpå der checkes om stien peger på en fil eller et bibliotek. Hvis den peger på et bibliotek, så kan man vel bare fyre stien/argumentet op i Page_Load hvor Request'en så bliver lig med stien/argumentet? Men jeg mangler lige en metode, hvorpå det kan gøres...?
Avatar billede snepnet Nybegynder
07. juli 2004 - 18:27 #29
Hvis du bruger min kode kan du når du opretter din linkbutton angive :
lbtn.CommandName = itemInfo.GetType().Name;

Og du kan så spørge på det i hanlderen:
((LinkButton)sender).CommandName == "DirectoryInfo"; // dir
((LinkButton)sender).CommandName == "FileInfo"; // Fil

Du få lige led mere senere... Jeg er på vej ud af døren.
Avatar billede snepnet Nybegynder
07. juli 2004 - 21:27 #30
led = lidt :o)

Nå... men du kan gemme information om dit nuværende dir hvor du skulle have lyst. Det kunne være i session eller viewstate - eller du kunne angive den i din Querystring.

Du kan lave en enkelt adgang til en sessionvariabel som følger :

// her returneres så startdiret fra før, hvis variablen ikke tidligere er sat
protected string CurrentPath
{
    get{return (object)Session["CurrentPath"] != null ? (string)Session["CurrentPath"] : Request.PhysicalApplicationPath;}
    set{Session["CurrentPath"] = value;}
}
Avatar billede cogitans Nybegynder
08. juli 2004 - 19:51 #31
Okay - "CurrentPath" returnerer stien til det foregående bibliotek eller hva?
Jeg er lidt i tvivl om koden...hvorfor er der en set-kommando i en metode, som skal returnere en string? Ah...det må være fordi, at "CurrentPath"-variablen skal opdateres efterfølgende ?
Avatar billede cogitans Nybegynder
08. juli 2004 - 19:57 #32
hmm...jeg har ikke lige set lyset endnu mht hvor i koden selve CurrentPath "mister" et led....altså går et bibliotek tlbage?
For hvis jeg kunne se det, så havde jeg sikkert også svaret på dette spørgsmål: hvordan opdaterer man så CurrentPath, når brugeren går et skrdt dybere ned i bibliotekshierakiet?
Avatar billede snepnet Nybegynder
09. juli 2004 - 10:23 #33
private void lbtn_Click(object sender, EventArgs e)
{
    if(((LinkButton)sender).CommandName == "DirectoryInfo")
    {
        CurrentPath = ((LinkButton)sender).CommandArgument;
    }
}

Efter du har fået opdateret CurrentPath, skal du så sørge for at få opdateret det du viser på skærmen.

Hvis du i page_load laver noget i retning af :
if(CurrentPath == null)
  CurrentPath = Request.ApplicationPath;

Og så ændrer lidt på din CurrentPath property

protected string CurrentPath
{
    get{return (object)Session["CurrentPath"] != null ? (string)Session["CurrentPath"] : null;}
    set{Session["CurrentPath"] = value;}
}

Så kan du jo nærmest bare lave en Response.Redirect(Request.RawUrl) i click-handleren.
Avatar billede cogitans Nybegynder
09. juli 2004 - 12:07 #34
Okay...det ser jeg lige på.
Gider du ikke lige skrive:

protected string CurrentPath
{
    get{return (object)Session["CurrentPath"] != null ? (string)Session["CurrentPath"] : Request.PhysicalApplicationPath;}
    set{Session["CurrentPath"] = value;}
}

og

protected string CurrentPath
{
    get{return (object)Session["CurrentPath"] != null ? (string)Session["CurrentPath"] : null;}
    set{Session["CurrentPath"] = value;}
}

på den gode gammeldaws måde med if-else-(not)-sætninger? ;-)
Avatar billede snepnet Nybegynder
09. juli 2004 - 18:06 #35
// for den første i getteren kunne du lave sådan en her :
if((object)Session["CurrentPath"] == null)
{
  Session["CurrentPath"] = Request.PhysicalApplicationPath;
}
return (string)Session["CurrentPath"];

// og for den anden getter kunne du nøjes med denn lave denne :
return (string)Session["CurrentPath"];
Avatar billede cogitans Nybegynder
09. juli 2004 - 18:29 #36
Ahh - okay. Så ':'-tegnet betyder '=' i 1-linieudgaven af if-else-sætninger (?).
Men i den anden/sidste bliver Sesson["CurrentPath"] da sat til value. Det må da betyde, at det du skrev ('return (string)Session["CurrentPath"];') er forkert, og der i stedet skal stå
'
if((object)Session["CurrentPath"] != null)
{
  Session["CurrentPath"] = null;
}
return (string)Session["CurrentPath"];
'

Desuden står der i den korte udgave "!=null". Altså bliver statementet opfyldt, hvis det ikke er lig med. Men i din sidste forklaring har du skrevet "==null". Er det dig, som har overset, at det netop ikke skulle være lig med null, eller er det mig, som har misforstået syntax'en?
Avatar billede snepnet Nybegynder
09. juli 2004 - 20:56 #37
Hvis du skriver sådan her :

if((object)Session["CurrentPath"] != null)
{
  Session["CurrentPath"] = null;
}
return (string)Session["CurrentPath"];

Står der i klar tekst :
"Hvis det ikke er null, så sæt det til null", hvilket jo så betyder at du aldrig vil få returneret andet end null.

Hvis du tager den jeg skrev :
if((object)Session["CurrentPath"] == null)
{
  Session["CurrentPath"] = Request.PhysicalApplicationPath;
}
return (string)Session["CurrentPath"];

Bliver det til :
"Hvis det er null, så sæt det til stien til programmet".

En property fungerer på den måde (hvis der altså både er angivet en getter og en setter), at du i kode kan skrive :
string test = CurrentPath;
Køres getteren for CurrentPath.

Skriver du istedet:
CurrentPath = "test";
Kaldes setteren for CurrentPath.

Du skal ikke læse det som en funktion der kører fra ende til anden hver gang den kaldes.
Avatar billede cogitans Nybegynder
12. juli 2004 - 14:12 #38
Nu har jeg så leget lidt med det. Men jeg kan ikke teste det endnu, da jeg ikke lige er klar over, hvordan man kalder Page_Load fra en metode?
Avatar billede snepnet Nybegynder
12. juli 2004 - 14:30 #39
Det ville også være lidt et sidespor hvis du begynde på det.... Har du noget særligt behov for at kalde den manuelt fremfor at reloade side ?

(du kan reloade med Response.Redirect(Request.RawUrl))
Avatar billede cogitans Nybegynder
12. juli 2004 - 14:41 #40
Ja, det skal vel ske, når brugeren klikker på et bibliotek. Herefter skal indholet jo vises, hvorved siden skal opdateres....?
Avatar billede cogitans Nybegynder
12. juli 2004 - 15:05 #41
...og Response.Redirect(Request.RawUrl) giver vel brugeren mulighe for at downloade et bibliotek, stedet for at opdatere indholdet af siden..?
Avatar billede snepnet Nybegynder
12. juli 2004 - 15:14 #42
Response.Redirect(Request.RawUrl) sørger bare for at din browser navigerer til nøjagtig samme url som den aktuelle.

Kan du ikke poste din kode så jeg kan hvordan den ser ud nu ?
Avatar billede cogitans Nybegynder
12. juli 2004 - 16:06 #43
Jo, selvfølgelig da. Nu er der jo også ret mange ændringer efterhånen:

using System;
using System.IO;
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 New;

namespace New
{
    /// <summary>
    /// Summary description for WebForm1.
    /// </summary>
    public class Ekspertentest : System.Web.UI.Page
    {
        protected System.Web.UI.WebControls.Table tblFileView;

        private void Page_Load(object sender, System.EventArgs e)
        {           
            //AddDirectoryView(Request.PhysicalApplicationPath);
            if(CurrentPath == null)
                CurrentPath = Request.PhysicalApplicationPath;
            AddDirectoryView(CurrentPath);
        }

        // metode til at smide rækkerne ind i tabellen
        public void AddDirectoryView(string path)
        {
            // først indsættes rækker for alle direktories i path
            string[] items = Directory.GetDirectories(path);           
            foreach (string s in items)
            {
                AddItem(new DirectoryInfo(s));
            }

            // derefter rækker for alle filer
            items = Directory.GetFiles(path);           
            foreach (string s in items)
            {
                AddItem(new FileInfo(s));
            }
        }

        // metode til at smide en enkelt række ind i tabellen
        private void AddItem(FileSystemInfo itemInfo)
        {
            tblFileView.Rows.Add(CreateItemRow(itemInfo));           
        }

        // metode til at danne en række
        private TableRow CreateItemRow(FileSystemInfo itemInfo)
        {
            TableRow tr = new TableRow();           

            // lidt farveværk
            if(itemInfo is DirectoryInfo)
                tr.BackColor = Color.LightBlue;
               
            // en linkbutton så man kan klikke på fil/dir navnet
            LinkButton lbtn = new LinkButton();
            lbtn.Click += new EventHandler(lbtn_Click);
            lbtn.Text = itemInfo.Name;
            lbtn.CommandArgument = itemInfo.FullName;
            lbtn.Style.Add("text-decoration","none");

            // ind med knappen
            tr.Cells.Add(CreateItemCell(lbtn));

            // ind med en ekstra oplysning
            tr.Cells.Add(CreateItemCell(new LiteralControl(itemInfo.CreationTime.ToString())));           

            return tr;
        }

        // metode til at danne en enekelt celle
        private TableCell CreateItemCell(Control content)
        {
            TableCell tc = new TableCell();
            tc.Controls.Add(content);
            return tc;
        }

        // håndtering af click-event fra knappen - CommandArgument skulle så gerne indeholde den fulde sti
        private void lbtn_Click(object sender, EventArgs e)
        {
            string selectedPath =  ((LinkButton)sender).CommandArgument;
            if (((LinkButton)sender).CommandName == "DirectoryInfo"){
              //send et bibliotek videre ind i path
              //Directory.GetDirectories;
              CurrentPath=selectedPath;
              this.Page_Load();
            }
            //ellers må det være en fil
            if(((LinkButton)sender).CommandName == "FileInfo"){
              Response.Redirect(selectedPath);
            } // Fil
            if(((LinkButton)sender).CommandName == "..")
            {
              int length=CurrentPath.Length+1;
                int index=CurrentPath.LastIndexOf("/");//returnerer index for slash
              string temp=CurrentPath.Remove(index, (length-index));
                CurrentPath=temp;
              this.Page_Load();
            }
        }

        // her returneres så startdiret fra før, hvis variablen ikke tidligere er sat
        //=her gåes et skridt tilbage 
        protected string CurrentStartPath
        {
            get{return (object)Session["CurrentPath"] != null ? (string)Session["CurrentPath"] : Request.PhysicalApplicationPath;}
            set{Session["CurrentPath"] = value;}
        }

        protected string CurrentPath
        {
            get{return (object)Session["CurrentPath"] != null ? (string)Session["CurrentPath"] : null;}
            set{Session["CurrentPath"] = value;}
        }
        #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>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {   
            this.Load += new System.EventHandler(this.Page_Load);

        }
        #endregion

        private void Repeater1_ItemCommand(object source, System.Web.UI.WebControls.RepeaterCommandEventArgs e)
        {
        }
    }
}
Avatar billede snepnet Nybegynder
12. juli 2004 - 17:16 #44
Hej cogitans... Der er lige et par småting (Du får vist ikke læst alt hvad jeg skriver ;o)

LinkButton lbtn = new LinkButton();
lbtn.Click += new EventHandler(lbtn_Click);
lbtn.Text = itemInfo.Name;

// Indsæt denne linie:
lbtn.CommandName = itemInfo.GetType().Name;

lbtn.CommandArgument = itemInfo.FullName;
lbtn.Style.Add("text-decoration","none");

Og skift :
this.Page_Load();
ud med :
Response.Redirect(Request.RawUrl);

Så skulle du gerne komme en smule videre.
Avatar billede cogitans Nybegynder
12. juli 2004 - 17:33 #45
Ja, nu hjalp det på det - det var dejligt.
Men nu er der jo så bare 2 nye spørgsmål:

1:
Er det ikke muligt, at lave en lille "menu" hvis man trykker på et link med højre museknap, så man får mulighed for at gemme hele bibliotekket, istedet for at man går et trin videre ne i biblioteksstrukturen?

2:
Når man så er gået et trin videre ned i biblioteksstrukturen, og man gerne vil 1 trin tilbage (eller flere trin), så har man tilsyneladende ikke mulghed for det. Og hvis man bare loader hele dukumentet ind igen, så husker den stadig hvor man var henne ad, og viser selvfølgelig det samme biblioteks indhold?
Avatar billede snepnet Nybegynder
12. juli 2004 - 17:45 #46
Mon ikke det er ved at være lidt uforsvarligt at fortsætte i samme spørgsmål. Vi er vist ved at være lidt ude over overskriften :o)
Avatar billede cogitans Nybegynder
12. juli 2004 - 18:20 #47
He he - jo, det har du så sandelig ret i. Jeg er blot overordentlig glad for, at jeg endelig kan få svar på mne spørgsmål her (af dig ;-) ). Det er nemlig efterhånden ret lang tid siden, at jeg oprettede adskillige andre spørgsmål, som alle handlede om mit problem her. Men der var ingen personer, som kunne hjælpe mig. Det er derfor, at jeg nyder din hjælp.
Og nu er hele mit oprindelige spørgsmål også snart blevet besvaret til UG. Men jeg mangler jo som sagt bare lige at finde ud af de 2 sidste delspørgsmål.
Men hvis du gerne vil have flere point for din uvurderlige hjælp, så vil jeg hellere end gerne give dig flere som tak for hjælpen...?
Avatar billede snepnet Nybegynder
12. juli 2004 - 21:57 #48
Hehe - bare jeg holder mig i top 8000 så er det mere end rigeligt... Det er ikke lige pointene jeg er her for :o)
Jeg kigger på dine nye spørgsmål her lidt senere - jeg har gæster.
Avatar billede snepnet Nybegynder
12. juli 2004 - 21:58 #49
Men et svar skal jo til :o)
Avatar billede cogitans Nybegynder
12. juli 2004 - 22:07 #50
Tak - det lyder i sanhed godt ;-)
Just take your time!
Avatar billede snepnet Nybegynder
13. juli 2004 - 00:40 #51
Hej der :o)

Mht. 1-eren :
Den er ikke så ligetil. Hvis du skal downlaode hele foldere skal du nok lave en rigtig ftp-klient - istedet for browserløsningen.
Men Internet Explorer (og sikkert også andre browsere) fungere ok som ftp-klient(er).
Med IE får du et helt almindeligt explorerview (ligesom når du klikker rundt i din foldere lokalt).
Begge dele kræver at du sætter en ftp-server op... Hvis du har et webhotel et eller andet sted ude i byen, har du sikkert ftp-adgang under alle omstændigheder.
Højrekliksmenuer vil du typisk lave clientside, og der er masser af eksempler rundt omkring... (søg på noget med context menu, browser, javascript og den slags).

2-eren er det bedre med :o)
hvis du laver lidt om på AddDirectoryView så den bliver noget i stil med :

        // metode til at smide rækkerne ind i tabellen
        public void AddDirectoryView(string path)
        {
            // idsæt parent path som øverste link
            AddItem(Directory.GetParent(path));

            // først indsættes rækker for alle direktories i path
            string[] items = Directory.GetDirectories(path);           
            foreach (string s in items)
            {
                AddItem(new DirectoryInfo(s));
            }

            // derefter rækker for alle filer
            items = Directory.GetFiles(path);           
            foreach (string s in items)
            {
                AddItem(new FileInfo(s));
            }
        }

Så begynder det at ligne eller andet.

Hvis du så deruderover laver din CurrentPath-property sådan her :
(sørger bare for at du starter i roden af dit C-drev)

protected string CurrentPath
{
    get{return (object)Session["CurrentPath"] != null ? (string)Session["CurrentPath"] : @"C:\";}
    set{Session["CurrentPath"] = value;}
}

Tilføjer en :
protected string LastPath
{
    get{return (string)Session["LastPath"];}
    set{Session["LastPath"] = value;}
}

Udvider din AddDirectoryView yderligere - til nedenstående :
(sørger for at du bliver stående samme sted i filstrukturen, hvis du prøver at stikke næsen i et dir du ikke må kigge i - istedet for at fejle)

public void AddDirectoryView(string path)
{
    try
    {
        // parant path
        DirectoryInfo parent = Directory.GetParent(path);
        if(parent != null)
            AddItem(parent);
   
        // først indsættes rækker for alle direktories i path
        string[] items = Directory.GetDirectories(path);
   
        foreach (string s in items)
        {
            AddItem(new DirectoryInfo(s));
        }           

        // derefter rækker for alle filer
        items = Directory.GetFiles(path);           
        foreach (string s in items)
        {
            AddItem(new FileInfo(s));
        }
    }
    catch
    {
        string lp = LastPath;
        CurrentPath = LastPath;
        LastPath = lp;
        Response.Redirect(Request.RawUrl);
    }
}

Og ændrer din handler så den indeholder noget ala nedenstående :
(Du har det vist det meste i forvejen)

private void lbtn_Click(object sender, EventArgs e)
{
    if(((LinkButton)sender).CommandName == "DirectoryInfo")
    {
        LastPath = CurrentPath;
        CurrentPath = ((LinkButton)sender).CommandArgument;                           

        Response.Redirect(Request.RawUrl);   
    }           
    else if(((LinkButton)sender).CommandName == "FileInfo")
    {
        Response.Redirect(((LinkButton)sender).CommandArgument);
    }
}

Så er det lige før at det også kan bruges til noget :o)
Avatar billede cogitans Nybegynder
13. juli 2004 - 10:58 #52
Hvad så med:

protected string CurrentStartPath
{
  get{return (object)Session["CurrentPath"] != null ? (string)Session
          ["CurrentPath"] : Request.PhysicalApplicationPath;}
  set{Session["CurrentPath"] = value;}
}

skal den metode så stadigvæk være tilstede?
Avatar billede snepnet Nybegynder
13. juli 2004 - 11:16 #53
Jeps - du ændrer bare sådan set bare
Request.PhysicalApplicationPath;
til
@"C:\";
Avatar billede cogitans Nybegynder
13. juli 2004 - 11:50 #54
Ja, det ved jeg...men metoden "CurrentStartPath" bliver da slet ikke brugt?

Det har lært mig en masse at få hjælp af dig. Men enkelte steder i koden er jeg dog lidt i tvivl om, hvad der helt nøjagtig sker. JEg kunne vel ikke få dig til, at skrive en note-/udkommateret linie ovenover hver kodelinie, hvor du kort beskriver hvad der sker i den efterfølgende kodelinie?
Avatar billede snepnet Nybegynder
13. juli 2004 - 12:19 #55
Undskyld.... det var mig der sov (frygteligt som de to navne minder om hinanden).
CurrentStartPath bruges ikke, så den kan du bare slette - min fejl.

Kan du ikke sende mig de "klodser" du er i tvivl om... Så skal jeg nok kommentere dem.
Avatar billede cogitans Nybegynder
13. juli 2004 - 14:11 #56
Hmm - der er altså noget galt med koden. Jeg har sat:

protected string CurrentPath
{
get{return (object)Session["CurrentPath"] != null ? (string)Session["CurrentPath"] :
      @"C:\Shared";}
set{Session["CurrentPath"] = value;}
}
Og den starter da også i et bibliotek, men jeg kan sagtens gå længere tilbage - altså ud til c-roden. Og den går jo ikke rigtig...?
Avatar billede snepnet Nybegynder
13. juli 2004 - 14:26 #57
Det er ikke fordi der er noget galt... Nu har du jo sådan set bare bygget en "explorer-hjemmeside".

Hvis du skal have lagt nogle restriktioner ind i programmet (ud over dem der automatisk gives af operativsystem mv.) skal du bygge det ind også, og det kan der være flere forskellige indgangsvinkler til / måder at lave på.
Avatar billede cogitans Nybegynder
13. juli 2004 - 14:50 #58
Nå da, jeg troede ellers, at der var noget security-haløj indbygget i C# ligesom i Java.
Du skulle vel ikke vide noget om nogle restriktionsmodeller så?
Avatar billede snepnet Nybegynder
13. juli 2004 - 15:04 #59
Joda :o)
Hvilket os bruger du ?
Avatar billede snepnet Nybegynder
13. juli 2004 - 15:04 #60
altså hvilket operativsystem
Avatar billede cogitans Nybegynder
13. juli 2004 - 15:40 #61
Jeg bruger Xp Pro.
MEn kan man egentlig ikke bare lave en if-sætning, når man går et trin tilbage i stien. Og hvis stien så bliver lig med roden af et drev, så kan stien ikke ryge det trin tilbage?
Avatar billede snepnet Nybegynder
13. juli 2004 - 17:13 #62
Joda... det er jo lidt afhængig af hvad du sådan helt præcis skal bruge.
Avatar billede cogitans Nybegynder
13. juli 2004 - 18:40 #63
Jamen, meningen er såmæn bare, at det ikke skal være muligt, at gå et skridt opad i biblioteksstrukturen regnet fra startsbibliotekket...?
Avatar billede snepnet Nybegynder
14. juli 2004 - 10:26 #64
Så synes jeg bare du skal lave det som du selv foreslog.
Avatar billede cogitans Nybegynder
14. juli 2004 - 12:36 #65
Yes - og det er let og lige til, når man tager din kode til hjælp?
Avatar billede snepnet Nybegynder
14. juli 2004 - 12:48 #66
Det håber jeg da :o)
Avatar billede cogitans Nybegynder
15. juli 2004 - 16:51 #67
Nu har jeg så leget ldt med koden, og har tilføjet et par linier i denne metode:

public void AddDirectoryView(string path)
        {
            try
            {
                // parent path
                DirectoryInfo parent = Directory.GetParent(path);
                if(parent.FullName == @"C:\") //check om stien er gået ud i c-roden
                    parent = Directory.SetCurrentDirectory(path); //sætter stien til c:\FTP
                if(parent != null)
                    AddItem(parent);
   
                // først indsættes rækker for alle direktories i path
                string[] items = Directory.GetDirectories(path);
   
                foreach (string s in items)
                {
                    AddItem(new DirectoryInfo(s));
                }           

                // derefter rækker for alle filer
                items = Directory.GetFiles(path);           
                foreach (string s in items)
                {
                    AddItem(new FileInfo(s));
                }
            }
            catch
            {
                string lp = LastPath;
                CurrentPath = LastPath;
                LastPath = lp;
                Response.Redirect(Request.RawUrl);
            }
        }

Men compileren vil ikke acceptere det. Har du nogle gode idéer?
Avatar billede snepnet Nybegynder
15. juli 2004 - 17:03 #68
Nedenstående vil ikke kunne kompilere :
parent = Directory.SetCurrentDirectory(path);

Directory.SetCurrentDirectory(...) en en void-metode (den returnerer ikke noget).
Det eneste den gør er at sætte det nuværende "arbejdsdir" til det du kalder den med.
Avatar billede cogitans Nybegynder
15. juli 2004 - 17:09 #69
Jo, men menes der så, at man f.eks. skal skrive således:
Directory.SetCurrentDirectory()=@"c:\FTP";
?
Avatar billede cogitans Nybegynder
15. juli 2004 - 17:11 #70
ahh...parent skal da slet ikke sættes til noget. Man skal vel bare skrive: "parent=path;" ?
Avatar billede snepnet Nybegynder
15. juli 2004 - 17:12 #71
nej - så menes der, at du skriver Directory.SetCurrentDirectory(@"C:\");
Avatar billede snepnet Nybegynder
15. juli 2004 - 17:14 #72
og du har ret i at du ikke rigtig kan bruge det til noget i din situation :o)
Avatar billede snepnet Nybegynder
15. juli 2004 - 17:16 #73
I det hele taget er det nok lettere for dig at lægge checke direkte ind i din CurrentPath property.
Avatar billede cogitans Nybegynder
15. juli 2004 - 17:17 #74
Awa? Duer det slet ikke i denne retning?
Så bliver jeg nok nødt til at bede dg om et forslag til en løsning så... :-0
Avatar billede snepnet Nybegynder
15. juli 2004 - 17:18 #75
Altå hvis du i setteren laver noget :

if (value == @"C:\")
    Session["CurrentPath"] = @"C:\FTP";
else
    Session["CurrentPath"] = value;

eller noget tilsvarende.
Avatar billede snepnet Nybegynder
15. juli 2004 - 17:21 #76
Hvad siger du så... 23 sekunder om et svar... det er da ikke meget :o)
Avatar billede cogitans Nybegynder
15. juli 2004 - 18:33 #77
Næh, det er faktisk skønt. Nu var jeg så godt nok bare fraværende indtil dette tidspunkt ;-)
Avatar billede cogitans Nybegynder
16. juli 2004 - 10:16 #78
Hmm...der er et eller andet mærkeligt galt nu.
Når jeg prøver at compilere hele mollevitten, så skriver den: "The namespace 'New' already contains a definition for 'FtpC'". Men jeg har ikke flere filer, af samme navn i workspacet. Skal jeg ind i en fil, og slette nogle oplysninger, som så bliver opdateret ved en ny compilering, eller skal jeg bare fysisk slette nogle filer i biblioteket? Eller hvordan skal dette problem klares?
Avatar billede snepnet Nybegynder
16. juli 2004 - 10:23 #79
cogitans... Kan du ikke acceptere mit svar, og begynde at oprette nogle nye spørgsmål.

Det er ikke fordi du nødvendigvis skal give point - du kan jo bare oprette dem som 0-pointere, hvis det er det der er problemet. Jeg skal nok svare alligevel.

Det virker en smulle fjollet at lade alle disse ting indgå i dette spørgsmål når man kigger på overskriften.

Det med namespaces har for øvrigt ikke noget med filer at gøre, men du får problemet hvis du f.eks. giver 2 klasser samme navn i samme namespace.
Avatar billede cogitans Nybegynder
16. juli 2004 - 10:27 #80
Jo, det kan du da have ret i. Det er måske lidt forvirende med alle disse delspørgsmål her.
Så derfor lukkes spørgsmålet nu (dog spørger jeg dig måske senere om forklaringer på enkelte kodedele i dit eksempel), og alle pointene ryger til 'snerpet'. Mange tak for hjælpen - det var virkelig dejligt med din seriøsitet ;-)
Avatar billede snepnet Nybegynder
16. juli 2004 - 10:29 #81
Det er bare iorden.... Du kan bare oprette nye spørgsmål i denne, eller ASP.NET kategorien. Så skal jeg nok se dem :o)
Avatar billede cogitans Nybegynder
16. juli 2004 - 10:38 #82
Jeg har oprettet et spørgsmål under http://www.eksperten.dk/spm/520386...
Avatar billede snepnet Nybegynder
16. juli 2004 - 10:45 #83
Men hvorfor har du ikke accepteret svaret her ?
Avatar billede cogitans Nybegynder
16. juli 2004 - 10:54 #84
Det gjorde jeg da også da jeg skrev 16/07-2004 10:29:43...men så gør jeg det lige nogle gange mere...
Avatar billede cogitans Nybegynder
16. juli 2004 - 10:55 #85
Så fungerede det...jeg skulle åbenbart klikke på dit navn, før jeg trykkede på 'accepter'. Eksperten burde da implementere det sådan, at hvis der kun er 1 svar, så bliver det automatisk det, man vælger, når man trykker på 'accepter'...
Avatar billede snepnet Nybegynder
16. juli 2004 - 11:08 #86
Ja det lyder rimeligt... Ved ikke hvorfor det er lavet sådan.
Avatar billede cogitans Nybegynder
19. juli 2004 - 11:52 #87
Så har jeg kigget lidt på koden, for at forstå den også :-)
Overordnet gver koden menng for mig, men der er nogle detaljer, som jeg ikke helt har styr på.
Hvis jeg f.eks. vil oprette en ny kollone med filens størelse - hvordan gør jeg så det? Jeg prøvede at dote mig ind på noget med "size" gennem "fileinfo", men det gav ikke rigtig noget. Og så når jeg endelig skulle sætte selve kollonen ind på sden, så gav et også problemer.
Er det noget, som du vil hjælpe mig med? ;-)
Avatar billede snepnet Nybegynder
19. juli 2004 - 12:06 #88
Hej cogitans.

Du kan flette det ind i
private TableRow CreateItemRow(FileSystemInfo itemInfo)

størrelsen af en fil kan du få ved:
if(itemInfo is FileInfo)
{
  int size = ((FileInfo)itemInfo).Length;
}

Det med at sætte en ekstra celle ind kan du også gøre i den metode, men hvis du skal have flere kolonner, skal du huske også at udvide tabellen i aspx-filen.
Alternativt kan du generere tabellen 100% dynamisk.

Mvh
Avatar billede cogitans Nybegynder
19. juli 2004 - 12:38 #89
Arg - ja, selvfølgelig er "length" da det samme som "size". Hvorfor tænkte jeg ikke på det?
Ændre i aspx-filen? Jeg troede egentlig, at aspx-filen blev genereret ud fra codebehindfilen? Altså at aspx-filen (=tabellen) blev genereret 100% dynamisk på nuværende tidspunkt?
Avatar billede snepnet Nybegynder
19. juli 2004 - 12:44 #90
Det gør den ikke... i hvert fald ikke hvis du bruger den her :
http://www.eksperten.dk/spm/517125#rid4750777
Avatar billede cogitans Nybegynder
19. juli 2004 - 13:08 #91
Ahh - nej, det gør den da heller ikke. Det er kun indholdet af tebellen, som genereres dynamisk...ik'?
Avatar billede snepnet Nybegynder
19. juli 2004 - 13:13 #92
Jeps... det er kun rækkerne under dine headers, men det er jo oprindeligt bare et eksempel.
Avatar billede cogitans Nybegynder
20. juli 2004 - 18:27 #93
Så er den gal igen....
Jeg har netop fundet ud af, at stierne til filerne ikke bliver angivet rigtigt. Når en anden bruger på netværket går ind på mn side, og klikker på et filnavn, så får brugeren at vide, at 'siden kan ikke vises'. Kan dette være fordi, at selvom aplikationen kører på serveren, så skal klienten aligevel have en URL, som når han skal have tilgang til en fil over netværket? Altså sådan at den komplette URL skal stå der med computernavn og det hele?
Avatar billede snepnet Nybegynder
20. juli 2004 - 18:32 #94
Ja hvis du laver en Response.Redirect til filen - eller opretter links direkte til den vha. den path du finder frem i koden.
Avatar billede cogitans Nybegynder
20. juli 2004 - 18:35 #95
At hvad så, sger du?
Metoden ser således ud:

        private void lbtn_Click(object sender, EventArgs e)
        {
            if(((LinkButton)sender).CommandName == "DirectoryInfo")
            {
                LastPath = CurrentPath;
                CurrentPath = ((LinkButton)sender).CommandArgument;                           

                Response.Redirect(Request.RawUrl);   
            }           
            else if(((LinkButton)sender).CommandName == "FileInfo")
            {
                DatabaseFtpManagement instans=new DatabaseFtpManagement();
                string filNavn=(string)((LinkButton)sender).CommandArgument;
                instans.run(this, filNavn);
                Response.Redirect(((LinkButton)sender).CommandArgument);
            }
        }

Og hvad skulle jeg så gøre?
Avatar billede snepnet Nybegynder
20. juli 2004 - 18:59 #96
Jeg synes du skal sørge for at de filer du vil give lov til at folk kan downloade, ligger i en folder under dit web, og så skrive almindelige links ud til brugeren.
Avatar billede cogitans Nybegynder
20. juli 2004 - 19:01 #97
Det var netop den løsning, jeg benyttede før denne aplikation. Men der var for mange negative sider ved det - derfor denne aplikation...
Avatar billede snepnet Nybegynder
20. juli 2004 - 19:04 #98
Hvilke negative sider ?
Avatar billede cogitans Nybegynder
20. juli 2004 - 19:05 #99
At jeg f.eks. ikke kan holde regnskab over, hvem der besøger mig, og hvad de besøgende er interesseret i...
Avatar billede snepnet Nybegynder
20. juli 2004 - 19:11 #100
Du kan jo lave en blanding hvor du lægger filerne i en folder under webbet, og redirecter til en url.
Avatar billede snepnet Nybegynder
20. juli 2004 - 19:12 #101
Men jeg kan ikke forstå hvorfor det ene frem for det andet, skulle give dig forskellige muligheder for at finde ud af hvem der har besøgt dig.
Avatar billede cogitans Nybegynder
20. juli 2004 - 19:12 #102
Meget muligt - men nu er det altså denne aplikation, jeg har valgt...
Avatar billede snepnet Nybegynder
20. juli 2004 - 19:13 #103
Og så har jeg stadig svært ved at forstå hvorfor du ikke sætter en ftp-server op :o)
Avatar billede cogitans Nybegynder
20. juli 2004 - 19:15 #104
Det gør jeg ikke, fordi jeg har denne aplikation, som skulle kunne gøre det samme - blot meget nemere (og så kan jeg selv videreudvikle den).
Avatar billede snepnet Nybegynder
20. juli 2004 - 19:22 #105
Er det det kode jeg har skrevet til dig du snakker om ?
Hvis det er tilfældet, hvor har du så fra at den skal kunne gøre det samme - blot lettere ?

Hvis det er en anden applikation du skriver om - kan du så ikke sende et link til noget info om den. Så kan det da være at jeg kan hjælpe med hvad der skal til for at implementere den.
(jeg synes du på et tidspunkt viste noget med nogle referencer til noget andet ftp-halløj).
Avatar billede cogitans Nybegynder
20. juli 2004 - 19:38 #106
:-) det er skam den aplikation, som du har skrevet, jeg taler om hér.
Med lettere mener jeg: kræver tilsyneladende ikke så meget ram, man kan sætte andre funktionalitetter ind, man kan tage fuld kontrol over overføslerne, man kan registrere overførslerne, som man vil og man skal ikke sørge for, at alle en links hele tiden passer.
Det var bare lige de argumenter, jeg kunne komme på lige nu.
Men altså - skal vi ikke bare droppe den ftp-snak - den bliver aligevel ikke aktuel.
Avatar billede snepnet Nybegynder
20. juli 2004 - 20:39 #107
Jo - lad os bare det.
Men hvorfor kan du ikke bare lægge dine filer i en folder under web'et, og lave din response.redirect med en url til filen ?
Avatar billede cogitans Nybegynder
20. juli 2004 - 20:43 #108
Hvad mener du me "under web'et"???
Jeg har nemlig prøvet med 2-3 forskellige URL-opbygninger...
Avatar billede snepnet Nybegynder
20. juli 2004 - 20:46 #109
Hvis din webfolder hedder
web
Så kan du jo lave en folder under det der hedder filer, og så lave den her (hvis du altså er på en side der ligger i roden af dit web):

Response.Redirect("Filer/filnavn.ext");
Avatar billede cogitans Nybegynder
20. juli 2004 - 20:54 #110
Det dér er f.eks. 1 af årsagerne til, at løsningen skal findes i en aplikation.
For ikke nok med, at der langt fra er plads til filerne i den folder, så er det også utrolg upraktisk.
Filerne er fordelt over 5-6 forskellige drev. Derfor ville et simpelt link være en genial løsning.
Avatar billede snepnet Nybegynder
20. juli 2004 - 21:07 #111
Ja det er muligt, men nu kan du altså ikke lave et filsystems-link til en fil på din maskine, med mindre du laver et link på formen :

\\<din ip>\<folder>\<filnavn>

Det indebærer så at folderene skal være delt så alle og en enhver bare kan bruge deres vanlige filsystemsbrowser til at kigge på dem, og så har du ikke meget at bruge din applikation til.
(alternativt... at du opretter windows-konti til dem der må kigge).

Du kan lave virtual directories under dit root-web, og få dem til at pege på de 5-6 forskellige steder du snakker om.
Avatar billede cogitans Nybegynder
20. juli 2004 - 21:24 #112
eh...jo. Men hvad betyder det hlt nøjagtig?
Skal jeg lave virtuelle biblioteker, som peget hen på det bibliotek, som mit genererede link peger på?
Avatar billede cogitans Nybegynder
27. juli 2004 - 20:16 #113
Nu har jeg jo så fundet ud af at kalde det virtuelle bibliotek ordentligt. Men koden fungerer stadig ikke rigtig.
Før stod der jo:
        protected string CurrentPath
        {
            get{return (object)Session["CurrentPath"] != null ? (string)Session["CurrentPath"] : @"D:MoviesNotBurnedYet";}
            set
            {
                if (value == @"D:\")
                    Session["CurrentPath"] = @"D:MoviesNotBurnedYet";
                else
                    Session["CurrentPath"] = value;
            }
        }

men hvis jeg erstatter:
"] : @"D:MoviesNotBurnedYet";}
med
"] : @"http://computernavn/test/";}
så belastes cpu'en bare med 100%, og så loader den...og loader...og loader.
Hvordan skriver man så URL'en?
Avatar billede snepnet Nybegynder
27. juli 2004 - 20:19 #114
Du skal stadig søge dine kataloger igennem på den måde du hele tide har gjort... Det er kun når du skal vise et link at du skal lave en url.
Avatar billede cogitans Nybegynder
27. juli 2004 - 20:22 #115
ahh...lbtn_Click er det eneste sted, hvor er skal rettes kode eller hva?
Avatar billede snepnet Nybegynder
27. juli 2004 - 20:25 #116
Du skal jo konvertere en fysisk sti til den virtuelle sti... Hvor du lægger det er jo op til dig.
Avatar billede cogitans Nybegynder
27. juli 2004 - 20:26 #117
yes.
Avatar billede cogitans Nybegynder
27. juli 2004 - 20:41 #118
Det virker skam stadigvæk ikke.
Når jeg kører det nu, og jeg trykker på et link på aspx-siden, så skriver den:

Detaljer om undtagelse: System.ArgumentException: Stien til MapPath 'http://computer/Musik/abc.mp3' er ugyldig. Der forventes en virtuel sti.
Og når jeg går ind i IIS, så hedder det mappede 'Musik', og inde i det bibliotek ligger abc.mp3. Så hvad kan der være galt?
Avatar billede snepnet Nybegynder
27. juli 2004 - 20:46 #119
ja der kan være det galt at dit default web ikke hedder computer.
Avatar billede cogitans Nybegynder
27. juli 2004 - 20:47 #120
men det hedder det...?
Avatar billede snepnet Nybegynder
27. juli 2004 - 20:49 #121
Hvis du bare i adressebar i din browser skriver :
http://computer/Musik/abc.mp3
Hvad sker der så ?
Avatar billede cogitans Nybegynder
27. juli 2004 - 20:51 #122
så bliver filen ekserkveret.
Hvis jeg skriver http://computer/Musik
så vises indholdet af bibliotekket.
Avatar billede snepnet Nybegynder
27. juli 2004 - 20:53 #123
Ahh... nu fik jeg lige læst din fejlmeddelelse lidt bedre. Du kan ikke lave en MapPath på noget der ikke ligger i dit web.
Hvor laver du i det hele taget en MapPath når du har url-en ?
Avatar billede cogitans Nybegynder
27. juli 2004 - 21:02 #124
MapPath? Hvad er det da? Er det ikke et andet ord for virtuel sti? For hvis det er dét, så er stien god nok.
Avatar billede cogitans Nybegynder
27. juli 2004 - 21:11 #125
Jeg laver lidt om på stien, fordi stien er stien på harddisken. Den sti skal laves om mht \ og /, og så skal den laves om til det virtuelle bibliotek.
Avatar billede cogitans Nybegynder
27. juli 2004 - 21:30 #126
Jeg synes, at det er meget mærkeligt lige nu.
Jeg har lige lavet en <A href...> udenfor al form-koden på aspx-siden. Og en fungerer fint nok. Og URL'en, den refererer til, er nøjagtig den samme, som der bliver genereret inde i formkoden i aspx-siden...
Avatar billede snepnet Nybegynder
27. juli 2004 - 21:35 #127
Der må være en eller anden forskel...
Avatar billede cogitans Nybegynder
27. juli 2004 - 21:39 #128
Det var fordi, at jeg ikke havde rettet koden. Der stod "Response.WriteFile(Url);", og der burde vel stå "Response.Redirect(endeligFil3);". Nu fungerer det i hvert fald på mn computer. Men hvorfor spørger den kun om man vil åbne, gemme eller annulere filen ved nogle bestemte filtyper, mens den blot direkte åbner andre?
Avatar billede snepnet Nybegynder
27. juli 2004 - 21:43 #129
Sådan er det bare... nogle gange for du jo muligheden for at angive at det man vælger skal være gældende fremover.
Man kan styre noget omkring det ved at pille ved mimetypes på iis-en.
Avatar billede cogitans Nybegynder
27. juli 2004 - 21:53 #130
ey? Nu ved jeg SLET ikke, hvad du taler om. Men jeg vil da gerne lære lidt mere om det...?
Avatar billede snepnet Nybegynder
27. juli 2004 - 22:04 #131
Du har en masse muligheder for at indstille ting og sager for iis-en. Nogle af indstillingerne har at gøre med hvad der skal angives som type i http-headers afhængig - angivet pr. fileextension.
det er ikke noget jeg er særlig meget inde i.
Avatar billede cogitans Nybegynder
27. juli 2004 - 22:11 #132
:-) nå, okay.
Avatar billede cogitans Nybegynder
31. juli 2004 - 00:47 #133
Jeg har forsøgt, at gøre det muligt, at gå ned ad en gren i biblioteksstrukturen, for derefter at trykke på et af de opringelige links, for at gå ned ad en anden startbiblioteksstruktur. Dette var jo ikke muligt før, eftersom det siste sted bliver gemt i sessionen. Jeg prøvede så, at null-stille sessionen, når brugeren trykkede på et af start linksene. Men dette virker ikke, da on_button_click åbenbart først bliver kaldt, efter linket er aktiveret, og sessionen derfor allerede har fået en værdi. Så derfor laves der rod i hele session-tingen, hvis jeg gør det på min måde.
Er der nogle andre (snepnet?), som har en god løsnng til dette problem?
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