Avatar billede agertoft Nybegynder
18. oktober 2004 - 15:59 Der er 12 kommentarer og
1 løsning

Hente TextBox.Text fra DataList

Jeg har en DataList med en række tekstboxe, der indeholder værdier fra mit DataSet. Uden for DataListen har en jeg Button, der når man trykker på den, skal hente disse TextBox.Text-værdier. Problemet er, at disse tekstboxe ikke bliver opfattet som initialiserede, når disse befinder sig i en DataList og dermed får jeg en null-pointer exception.

Hvis jeg tager min Button og flytter den ind i footeren på min DataList, registrerer den ikke, at der er tilknyttet en eventhandler på denne Button.

Hvordan løser jeg mit problem?
Avatar billede agertoft Nybegynder
18. oktober 2004 - 16:28 #1
Efterårsferien er slut... kom så ;-)
Avatar billede agertoft Nybegynder
18. oktober 2004 - 17:06 #2
snepnet? ;-)
Avatar billede snepnet Nybegynder
18. oktober 2004 - 17:38 #3
hej agertoft :o)
Kan du ikke vise mig din handler til klik-eventet på knappen ?
mvh
Avatar billede snepnet Nybegynder
18. oktober 2004 - 17:52 #4
hvordan har du forøvrigt lavet din DataList... har du en aspx-template, hvor du bare har indsat nogle asp:TextBox id="blabla" Text= osv ?

Nå... du får lige et lille eksempel her, så kan du lige se om der er noget af det der får en klokke til at ringe... Der skulle ikke være nogle problemer i det.

// aspx-filen her
<%@ Page language="c#" Codebehind="DataListPage.aspx.cs" AutoEventWireup="false" Inherits="EXP2.DataListPage" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
    <HEAD>
        <title>DataListPage</title>
        <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
        <meta name="CODE_LANGUAGE" Content="C#">
        <meta name="vs_defaultClientScript" content="JavaScript">
        <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
    </HEAD>
    <body>
        <form id="Form1" method="post" runat="server">
            <asp:DataList id="DataList1" runat="server">
                <ItemTemplate>
                    <asp:TextBox id=MinTextbox runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "FldString") %>'>
                    </asp:TextBox>
                </ItemTemplate>
            </asp:DataList>
            <P><asp:Button id="Button1" runat="server" Text="Button"></asp:Button></P>
        </form>
    </body>
</HTML>


// og en codebehind fil :
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 ExpArticles.ExpData;
namespace EXP2
{
    public class DataListPage : System.Web.UI.Page
    {
        protected System.Web.UI.WebControls.Button Button1;
        protected System.Web.UI.WebControls.DataList DataList1;
   
        private void Page_Load(object sender, System.EventArgs e)
        {
            if(!IsPostBack)
            {
                SampleDataSet ds = new ExpDataAccess().GetSampleData(5);
                DataList1.DataSource = ds;
                DataBind();
            }
        }

        private void Button1_Click(object sender, System.EventArgs e)
        {
            foreach(DataListItem li in DataList1.Items)
            {
                // du henter så fra tekstboksen sådan her :
                string text = ((TextBox)li.FindControl("MinTextbox")).Text;
            }
        }

        override protected void OnInit(EventArgs e)
        {
            InitializeComponent();
            base.OnInit(e);
        }
       
        private void InitializeComponent()
        {   
            this.Button1.Click += new System.EventHandler(this.Button1_Click);
            this.Load += new System.EventHandler(this.Page_Load);
        }
    }
}
Avatar billede snepnet Nybegynder
18. oktober 2004 - 17:54 #5
Håber du kan bruge det til et eller andet.... Jeg er på vej ud af døren nu, men jeg sidder ved orglet igen lidt senere :o)
mvh
Avatar billede agertoft Nybegynder
18. oktober 2004 - 19:00 #6
Perfekt, snepnet...

foreach(DataListItem li in DataList1.Items)
{
    // du henter så fra tekstboksen sådan her :
    string text = ((TextBox)li.FindControl("MinTextbox")).Text;
}

var præcis det jeg ledte efter :) læg et svar..
Avatar billede agertoft Nybegynder
18. oktober 2004 - 19:05 #7
"hvordan har du forøvrigt lavet din DataList... har du en aspx-template, hvor du bare har indsat nogle asp:TextBox id="blabla" Text= osv ?"

Jep :) ellers ligger alt andet i codebehind-filen..
Avatar billede snepnet Nybegynder
18. oktober 2004 - 19:28 #8
Alletiders :o)
Vi skrives ved.
Mvh
Avatar billede agertoft Nybegynder
18. oktober 2004 - 19:53 #9
Hovsa, jeg lagde i min ivrighed da ikke lige mærke til, at denne knap stadig ikke virker, når jeg placerer den i mit <FooterTemplate>. Så brokker min eventhandler sig pga den åbentbart ikke kan finde denne Button.

Men det ville være smart at placere den netop i dette FooterTemplate, da DataListen ikke bliver vist, med mindre man er logget ind...

Min eventhandler ser således ud:

private void InitializeComponent()
{
    this.updateButton.Click += new System.EventHandler(this.updateButton_Click);
    this.Load += new System.EventHandler(this.Page_Load);
}
Avatar billede agertoft Nybegynder
18. oktober 2004 - 19:54 #10
Og jeg får følgende output-fejl:

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error:

Line 90:         private void InitializeComponent()
Line 91:         {
Line 92:             this.updateButton.Click += new System.EventHandler(this.updateButton_Click);
Line 93:             this.Load += new System.EventHandler(this.Page_Load);
Line 94:
Avatar billede snepnet Nybegynder
18. oktober 2004 - 20:12 #11
Nej det er korrekt... Du kan få fat i den på to måder :

1)
Du kan abbonnere på ItemCommand-eventet på din DataList, og i handleren - som vil se ud i stil med nedenstående :

// denne her i Init
this.DataList1.ItemCommand += new DataListCommandEventHandler(this.DataList1_ItemCommand);

// og denne her et sted i klassen
private void DataList1_ItemCommand(object source, DataListCommandEventArgs e)
{
}

Kan du finde ud af hvad det er der har afstedkommet eventet på
e.CommandSource

Så en lidt mere komplet kunne være :
private void DataList1_ItemCommand(object source, DataListCommandEventArgs e)
{
  if(e.CommandSource is Button)
  {
    Button btn = (Button)e.CommandSource;
    // du kan så angive CommandName og CommandArgument på en knap så :
    if(btn.CommandName == "SomeCommand")
      DoSomething(btn.CommandArgument);
  }
}

...

Alternativt kan du angive hvilken handler du vil bruge i selve din template sådan her :

<FooterTemplate>
    <asp:Button id="someButton" runat="server" Text="Button" OnClick="MyHandler"></asp:Button>
</FooterTemplate>

og så i koden oprette handleren manuelt sådan her :

protected void MyHandler(object sender, EventArgs e)
{
  // ...
}

Bemærk at signaturen er en lidt anden, og at det er nødvendigt at du angiver den som public eller protected.

Håber det var det du skulle bruge :o)

mvh
Avatar billede agertoft Nybegynder
18. oktober 2004 - 20:29 #12
Jamen dog... jeg takker mange gange igen. Prøvede første løsning, og den virker jo fint. Men jeg finder dog den sidste løsning som den mest overskuelige, så den vil jeg holde mig til. Jeg takker mange gange igen :)
Avatar billede snepnet Nybegynder
18. oktober 2004 - 20:33 #13
Jamen det var i hvert fald så lidt :o)
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