Avatar billede ihtezaz Praktikant
04. november 2004 - 00:12 Der er 22 kommentarer og
1 løsning

Når der klikkes på item_comman på datagrid, skal datagrid.datakey

Hej

Jeg har en datagrid med item_command link på. Det jeg ønsker, er at når der trykkes på en item_command, skal den sende datagrid.datakey[e.item.ItemIndex] videre til min button_click event.

Jeg formår man kan brug sender til det, men hvordan skal det bikses sammen ?

På forhånd tak.
Avatar billede snepnet Nybegynder
04. november 2004 - 08:40 #1
hej ihtezaz :o)

du kan ikke ændre signaturen de eventhandlere du skriver om, men du kan sørge for at sætte værdien CommandName eller CommandArgument på dine knapper i forbindelse med databinding.
du kan så efterfølgende læse dem igen ved f.eks. :
((LinkButton)source).CommandArgument;

jeg er ikke helt med på hvad du skriver.... datagriddet benytter eventbubling for at propagere events i griddet op som ItemCommands, men du skriver også om button_Click... kan du vise lidt af den betydende kode ?

mvh
Avatar billede ihtezaz Praktikant
04. november 2004 - 10:47 #2
Hejsa snepnet.

jo da her kan du se koden hvor jeg skal bruge


        private void btnRetNote_Click(object sender, System.EventArgs e)
        {
            SqlCommand retNoteCmd = sqlCon.CreateCommand();
            retNoteCmd.CommandType = CommandType.StoredProcedure;
            retNoteCmd.CommandText = "StoredProcedure24";
            retNoteCmd.Parameters.Add(new SqlParameter("@LicensID",SqlDbType.BigInt));
retNoteCmd.Parameters["@LicensID"].Value = // datagrid.datakey[e.item.ItemIndex]            retNoteCmd.Parameters.Add(new SqlParameter("@tekst",SqlDbType.NVarChar,50));
            retNoteCmd.Parameters["@tekst"].Value = txtNote.Text;
Avatar billede ihtezaz Praktikant
04. november 2004 - 10:49 #3
i retNoteCmd.Parameters["@LicensID"].Value skal jeg brug LicensID fra den række i datagridet, hvor ItemCommand er trykket ud for.
Avatar billede ihtezaz Praktikant
04. november 2004 - 10:57 #4
Det vil sige at jeg kan indkapsle "datagrid.datakey[e.item.ItemIndex]" i min link knap's CommandArgument og hent det i min min knap udenfor datagridet ?
Avatar billede snepnet Nybegynder
05. november 2004 - 08:07 #5
hvis jeg ellers forstår dit spørgsmål rigtigt - så ja.... har du "wired" din eventhandler direkte i aspx-koden ?
hvis du lægger den aspx-kode der sætter knappen herud + hvis du har noget kode i en ItemDataBound handler ell. så skal du få et forslag tilbage.
mvh
Avatar billede ihtezaz Praktikant
05. november 2004 - 19:02 #6
finno snepnet
her kommer koden:


        private void btnRetNote_Click(object sender, System.EventArgs e)
        {
           
            SqlCommand retNoteCmd = sqlCon.CreateCommand();
            retNoteCmd.CommandType = CommandType.StoredProcedure;
            retNoteCmd.CommandText = "dbo.StoredProcedure24";
            retNoteCmd.Parameters.Add(new SqlParameter("@LicensID",SqlDbType.BigInt));
            retNoteCmd.Parameters["@LicensID"].Value = //her skal datagrids datakey vises,altså ud fra hvilken linkbutton der blev trykket på//dgOversigt.DataKeys[item.itemIndex];
            retNoteCmd.Parameters.Add(new SqlParameter("@tekst",SqlDbType.NVarChar,50));
            retNoteCmd.Parameters["@tekst"].Value = txtNote.Text;
           
            sqlCon.Open();
            try
            {
                retNoteCmd.ExecuteNonQuery();
            }

            catch(SqlException sqlEx)
            {
                Trace.Write(sqlEx.Message.ToString());
            }
           
            catch(Exception ex)
            {
                Trace.Write(ex.Message.ToString());
            }
            sqlCon.Close();
           
            txtNote.ReadOnly = true;

        }





og itemcommand eventhandler:


private void dgOversigt_ItemCommand_1(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
        {
       
            if(e.Item.ItemType != ListItemType.Pager)
            {

                if(e.CommandName.Equals("Note"))
                {
                    if(dgComputer.Visible)
                    {
                        dgComputer.Visible = false;
                    }

                    txtNote.Visible = false;
                    string note;
                    SqlCommand HentNoteCmd  = sqlCon.CreateCommand();   
           
                    HentNoteCmd.CommandType = CommandType.Text;
                    HentNoteCmd.CommandText = "SELECT Note FROM Licens WHERE LicensID="+dgOversigt.DataKeys[e.Item.ItemIndex].ToString();       
           
                    sqlCon.Open();
                    note = HentNoteCmd.ExecuteScalar().ToString();
                    sqlCon.Close();

                    if(!note.Equals(""))
                    {
                        txtNote.Text = note;
                        txtNote.Visible = true;
                        btnRetNote.Visible = true;
                        btnRet.Visible = true;
                    }

                }
                else
                {
                    if(txtNote.Visible)
                    {
                        txtNote.Visible = false;
                    }

                    if(!dgComputer.Visible)
                    {
                        dgComputer.Visible = true;
                    }
                    SqlCommand cmdHentCP = sqlCon.CreateCommand();
                    cmdHentCP.CommandType = CommandType.StoredProcedure;
                    cmdHentCP.CommandText = "dbo.StoredProcedure7";
           
                    cmdHentCP.Parameters.Add(new SqlParameter("@LicensID",SqlDbType.Int));
                    cmdHentCP.Parameters["@LicensID"].Value = dgOversigt.DataKeys[e.Item.ItemIndex];
           
                    sqlCon.Open();
                    dgComputer.DataSource = cmdHentCP.ExecuteReader();
                    dgComputer.DataBind();
                    sqlCon.Close();


                }
            }
        }
Avatar billede ihtezaz Praktikant
05. november 2004 - 19:06 #7
Dvs. at dgOversigt.DataKeys[e.Item.ItemIndex] skal føres over i btnRetNote_Click eventhandleren.
Avatar billede snepnet Nybegynder
05. november 2004 - 19:51 #8
hej igen ihtezaz :o)

mange tak.... men jeg kan ikke se hvor du opretter din knap i det kode du har sendt, så jeg er bange for at du kommer til at den del af din aspx-fil også (jeg går ud fra at det er der det står).

mvh
Avatar billede ihtezaz Praktikant
05. november 2004 - 20:40 #9
Jeg opretter både link knapperne på datagridet og min knap fra designeren i visual studio.
Avatar billede snepnet Nybegynder
05. november 2004 - 20:44 #10
det er helt fint, men jeg vil stadig meget gerne se den aspx-kode der vedrører btnRetNote.
det er ikke nødvendigt med andet.
Avatar billede ihtezaz Praktikant
05. november 2004 - 20:44 #11
<asp:Button id="btnRet" style="Z-INDEX: 107; LEFT: 479px; POSITION: absolute; TOP: 209px" runat="server" Width="68px" Text="Ret Note" Visible="False"></asp:Button>
Avatar billede ihtezaz Praktikant
05. november 2004 - 20:48 #12
håber det hjælper, kunne man eventuelt lægge dgOversigt.DataKeys[e.Item.ItemIndex] inde i viewstate collectionen, og derefter kunne hente det i min btnRet's eventhandler ?
Avatar billede snepnet Nybegynder
05. november 2004 - 20:58 #13
øhhh... nu bliver jeg lidt forvirret her ?!? - sidder den knap ikke i inde i dit grid ?
Avatar billede snepnet Nybegynder
05. november 2004 - 20:58 #14
(altså er det ikke en knap der indsættes for hver række ?)
Avatar billede ihtezaz Praktikant
05. november 2004 - 21:03 #15
ups..jeg troede du ville se knappen hvor til dgOversigt.DataKeys[e.Item.ItemIndex] skulle føres til..sorry.
Sender det andet her:


<asp:label id="Label1" style="Z-INDEX: 101; LEFT: 218px; POSITION: absolute; TOP: 23px" runat="server" Font-Size="Large" Font-Bold="True">Licens oversigt</asp:label><asp:datagrid id="dgOversigt" style="Z-INDEX: 102; LEFT: 15px; POSITION: absolute; TOP: 304px" runat="server" Width="799px" Visible="False" CellPadding="4" BackColor="White" BorderWidth="1px" BorderStyle="None" BorderColor="#3366CC" Height="120px" DataKeyField="LicensID" PageSize="6" AllowPaging="True">
                <SelectedItemStyle Font-Bold="True" ForeColor="#CCFF99" BackColor="#009999"></SelectedItemStyle>
                <ItemStyle ForeColor="#003399" BackColor="White"></ItemStyle>
                <HeaderStyle Font-Bold="True" ForeColor="#CCCCFF" BackColor="#003399"></HeaderStyle>
                <FooterStyle ForeColor="#003399" BackColor="#99CCCC"></FooterStyle>
                <Columns>
                    <asp:ButtonColumn Text="Slet" ButtonType="PushButton" HeaderText="Slet" CommandName="Delete"></asp:ButtonColumn>
                    <asp:EditCommandColumn ButtonType="PushButton" UpdateText="Opdater" HeaderText="Ret" CancelText="Anuller" EditText="Ret"></asp:EditCommandColumn>
                    <asp:ButtonColumn Text="Vis Note" HeaderText="Note" CommandName="Note"></asp:ButtonColumn>
                    <asp:ButtonColumn Text="Computer" HeaderText="Tilh&#248;rende computer" CommandName="Computer"></asp:ButtonColumn>
                </Columns>
                <PagerStyle HorizontalAlign="Left" ForeColor="#003399" BackColor="#99CCCC" Mode="NumericPages"></PagerStyle>
            </asp:datagrid>
Avatar billede ihtezaz Praktikant
05. november 2004 - 21:07 #16
Det er knappen med Text= "vis Note" det drejer sig om.
Avatar billede snepnet Nybegynder
05. november 2004 - 21:16 #17
ok.... med fare for at jeg ikke er helt med på dit setup :

if(!note.Equals(""))
{
    txtNote.Text = note;
    txtNote.Visible = true;
    btnRetNote.Visible = true;
    btnRetNote.CommandArgument = dgOversigt.DataKeys[e.Item.ItemIndex].ToString();
    btnRet.Visible = true;
}

Og du skal så sørge for at wire din eventhandler på knappen... det kan du gøre i din aspx-kode (har lige fjernet dine styles) :
<asp:Button id="btnRet" Text="Ret Note" Visible="False" OnClick="btnRetNote_Click"></asp:Button>

Og i handleren skal du så :
retNoteCmd.Parameters["@LicensID"].Value = int.Parse(((Button)sender).CommandArgument);

mvh
Avatar billede ihtezaz Praktikant
05. november 2004 - 22:46 #18
du er helt med snepnet, tak, jeg prøver lige og vender tilbage. Jeg lære squ meget af dig.
Avatar billede ihtezaz Praktikant
05. november 2004 - 23:04 #19
Tak det virker super godt. Jeg har lige et spørgsmål snepnet, Er det en dum ide at have for mange typecast's i sit program, jeg har lidt dårlig samvittighed med det, er det med god grund ? Smid også lige et svar.
Avatar billede snepnet Nybegynder
05. november 2004 - 23:29 #20
jamen det er jo bare super :o)

du skal ikke tage det så tungt med typecasting - det er uundgåeligt når man arbejder med så megen generisk funktionalitet.

Der er self. et mindre eller større overhead ved det.... Hvis det er noget du vil gnave dig lidt længere ned i skal du søge på typecasting, boxing og unboxing.

I en applikation som den du laver tager det at dekode dit viewstate sikkert 1000 gange så lang tid som alle dine typecasts tilsammen - såhh.... det er nok ikke noget du skal spekulere så meget over i denne forbindelse.

mvh
Avatar billede snepnet Nybegynder
05. november 2004 - 23:35 #21
boxing/unboxing er der en fin en om her :
http://www.dnzone.com/ShowDetail.asp?NewsId=377

og der er sikket også steder hvor folk har lavet nogle målinger på det, men hvis du ikke lige kan finde det, kan du ret hurtigt lave en lille rutine der gør det en milion gange - og så se hvor lang tid det tager.

mvh
Avatar billede ihtezaz Praktikant
05. november 2004 - 23:40 #22
Finno mange tak endnu en gang. Vi skrives jo ved.
Avatar billede snepnet Nybegynder
05. november 2004 - 23:44 #23
jepper det håber jeg da.... vi må jo holde gang i kategorien :o)
/snep
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