[ASP.NET] Updaten van gegevens in een datalist*

Pagina: 1
Acties:

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 13:15
We kennen het allemaal wel:
C#:
1
2
3
4
        public void productDataList_Update(Object sender, DataListCommandEventArgs e)
        {
            // Update code
        }
Maar wat als ik nu wil update dmv de druk op eeen nadere knop:
C#:
1
2
3
4
        private void updateButton_Click(object sender, System.EventArgs e)
        {
            // Update code
        }
Hoe krijg ik dan de waarde van e, die je nodig hebt om waarden uit je datalist te halen. In mijn geval is er altijd maar 1 record in m'n datalist, dus als ik e kan faken vind ik het ook goed. Dus: Wat is "e" eigenlijk?

Roomba E5 te koop


Verwijderd

kan je mischien je huidige code posten...
dan snap ik mischien wat je precies wil

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Geef je button een commandname mee en ga met ItemCommand-handler van je datagrid / datalist / whatever spelen.

Staat hij echt buiten je control, dan gaat het een enorm rotwerk worden en moet je zelf je datagrid de rows van gaan doorlopen, handmatig. Beter kan je dan de controls in een div / tabel plaatsen c.q. je eigen control maken.

Maar als er maar 1 item is; waarom zou je dan zoveel moeite doen om een datalist te gaan gebruiken? :?

* gorgi_19 zwaait naar beneden.. :P hoi whoami

[ Voor 70% gewijzigd door gorgi_19 op 20-11-2003 14:34 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:10
Staat die button ergens anders op je form, of staat die button ergens in je datalist?
Als ie in je datalist staat, dan moet je idd met de CommandName property van die button spelen; het juiste DataList-event (Update, Delete, .... ) wordt dan getriggered als er op die button geklikt wordt.
Als je button niet in je datalist staat, maar ergens anders op je webform, dan denk ik niet dat je met die commandname alleen verder kunt. Je kan dan nl. niet weten van welke datalist/grid het updatecommand moet getriggered worden. Indien dit het geval is, dan zal je met de DataKeys, SelectedIndex, etc... properties van de datalist moeten gaan spelen.

https://fgheysels.github.io/


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 13:15
De datalist:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<asp:datalist id="productDataList" OnEditCommand="productDataList_Edit" OnCancelCommand="productDataList_Update" OnUpdateCommand="productDataList_Cancel" DataKeyField="id" runat="server">
<ItemTemplate>
    <TR>
        <TD style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">Name</TD>
        <TD style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"><%# DataBinder.Eval(Container.DataItem, "name") %></TD>
    </TR>
</ItemTemplate>
<EditItemTemplate>
    <TR>
        <TD style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">Name</TD>
        <TD>
            <asp:TextBox id="name" Text='<%# DataBinder.Eval(Container.DataItem, "name") %>' Runat="server" Width="160px" Font-Name="Arial" Font-Size="10pt"></asp:TextBox>
        </TD>
    </TR>
</EditItemTemplate>
</asp:DataList>
De knop:
C#:
1
<asp:Button id="updateButton" runat="server" class="BUTTON" Text="Save"></asp:Button>
En de code achter de knop:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
private void updateButton_Click(object sender, System.EventArgs e)
{
    SqlConnection myConnection = new SqlConnection(ConfigurationSettings.AppSettings["connString"]);
    SqlCommand updateProductCommand = new SqlCommand("crm_updateProductDetails", myConnection);
    updateProductCommand.CommandType = CommandType.StoredProcedure;
    
    // productID op halen (werkt)
    updateProductCommand.Parameters.Add(new SqlParameter("@productID", SqlDbType.Int)).Value = productDataList.DataKeys[0];
    // naam uit teksbox (werkt niet)
    //updateProductCommand.Parameters.Add(new SqlParameter("@name", SqlDbType.VarChar, 50)).Value = ((System.Web.UI.WebControls.TextBox)productDataList.FindControl("name")).Text;

    // etc.
}
Het gaat dus om die laatste regel, normaal zou je "((System.Web.UI.WebControls.TextBox)e.Item.FindControl("name")).Text;" gebruiken, maar e heb ik nu dus niet.

Roomba E5 te koop


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:10
Nee, dat werkt idd niet omdat die button geen DataListCommandEventArgs heeft, wat logisch is, aangezien hij niets van een DataList af weet.
Je kan in je OnClick van die button natuurlijk wel gaan nagaan welke rij er van die datalist moet geupdated worden.
Een DataList heeft nl. een EditItemIndex etc....
code:
1
MyDataList.Items[MyDataList.EditItemIndex].FindControl()

https://fgheysels.github.io/


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 13:15
whoami schreef op 20 november 2003 @ 14:38:
code:
1
MyDataList.Items[MyDataList.EditItemIndex].FindControl()
Dat werkt als een trein, was ik dus al weer een uur naar op zoek. Thnx dude!

Roomba E5 te koop


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 13:15
Volgende probleem: ik heb ook een aantal checkboxes in een datalist staan:
C#:
1
2
3
4
5
<asp:datalist id="standardModuleList" runat="server" Enabled="False" Font-Names="Arial" Font-Size="10pt" RepeatLayout="Flow">
    <ItemTemplate>
        <asp:CheckBox id=standardModule runat="server" Enabled="True" Text='<%# DataBinder.Eval(Container.DataItem, "name") %>' Checked='<%# Evaluate("checked", (int)DataBinder.Eval(Container.DataItem, "standard")) %>'></asp:CheckBox>
    </ItemTemplate>
</asp:DataList>
en nu had ik zelf al uitgevogeld dat ik een checkbox zo aan kan roepen:
C#:
1
2
3
CheckBox txtChk  = (System.Web.UI.WebControls.CheckBox)standardModuleList.Items[0].FindControl("standardModule");
Response.Write (txtChk.Text);
Response.Write (txtChk.Checked);

Nu wilde ik dus in een loop alle checkboxes aanroepen:
C#:
1
2
3
4
foreach(ListItem li in standardModuleList.Items)
{
    // loop
}
maar ik krijg een "System.InvalidCastException: Specified cast is not valid." error op de foreach-loop? Ik gebruik deze code ergens anders ook voor een checkboxlist en dat werkt wel.

Roomba E5 te koop


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:10
Je moet checken of de control die je wilt casten wel een checkbox is, en je moet natuurlijk ook niet alle items overlopen:
de header en de footer bv moet je niet gaan overlopen, daar zul je dus moeten op checken.

https://fgheysels.github.io/


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 13:15
Hij komt niet eens zover, bij het aanroepen van de foreach-loop crasht hij al, ook als er verder niets aan staat.

Edit:
Ik kom nu net iets tegen over ControlCollections. Kan ik daar iets mee?

[ Voor 27% gewijzigd door sig69 op 20-11-2003 16:46 ]

Roomba E5 te koop


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

sig69 schreef op 20 november 2003 @ 16:31:
Hij komt niet eens zover, bij het aanroepen van de foreach-loop crasht hij al, ook als er verder niets aan staat.
Dus crashed hij op je HeaderItem? :?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:10
sig69 schreef op 20 november 2003 @ 16:31:
Hij komt niet eens zover, bij het aanroepen van de foreach-loop crasht hij al, ook als er verder niets aan staat.

Edit:
Ik kom nu net iets tegen over ControlCollections. Kan ik daar iets mee?
Ja. Of wacht.... nee.

Ergo: geef eens wat meer info. Onze glazen bol is kapot, .oisyn heeft 'm laten vallen.

https://fgheysels.github.io/


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 13:15
Hehe... ik ben er uit hoor (kreeg ineens een ingeving). Ik zal morgen de code posten voor de geinteresseerden, ga nu eerst naar huis...

Roomba E5 te koop

Pagina: 1