Avatar billede dex_dexter Nybegynder
10. november 2005 - 16:32 Der er 28 kommentarer og
1 løsning

checkbox i dataset, edit

Jeg har et dataset hvori der er et felt med en checkbox i, denne checkbox skal repræsentere et 0 eller 1 i en sql database.
jeg kan fint tilskrive den værdien, ved at tjekke på datarow værdien i min itembound event.
men hvordan får jeg sat værdien i checkboxen i det øjeblik hvor brugeren trykker på edit? jeg kan jo ikke teste på den i itembound, for da eksisterer den control ikke, og det gør den heller ikke i editcommand eventen.

men itembound burde også blive kørt når den bygger datagriddet i edit mode, men hvordan kan jeg skilne mellem de 2 tilstande?
Avatar billede snepnet Nybegynder
10. november 2005 - 16:44 #1
hej dex
her eksempler på begge dele:

<asp:DataGrid ID="grid" runat="server" OnEditCommand="grid_EditCommand" OnItemDataBound="grid_ItemDataBound" OnUpdateCommand="grid_UpdateCommand">
    <Columns>
        <asp:EditCommandColumn CancelText="Cancel" EditText="Edit" UpdateText="Update"></asp:EditCommandColumn>
    </Columns>
</asp:DataGrid>

// og koden
    string[] strings = { "hej" };
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            BindGrid();
        }
    }

    protected void BindGrid()
    {
        grid.DataSource = strings;
        grid.DataBind();
    }
   
    protected void grid_ItemDataBound(object sender, DataGridItemEventArgs e)
    {
        if (e.Item.ItemIndex != -1 && e.Item.ItemIndex == grid.EditItemIndex)
        {
            TextBox tb = e.Item.Cells[1].Controls[0] as TextBox;
            string tekst = tb.Text;
        }
    }
   
    protected void grid_EditCommand(object source, DataGridCommandEventArgs e)
    {
        grid.EditItemIndex = e.Item.ItemIndex;
        BindGrid();
    }
    protected void grid_UpdateCommand(object source, DataGridCommandEventArgs e)
    {
        TextBox tb = e.Item.Cells[1].Controls[0] as TextBox;
        string test = tb.Text;
    }

så skulle du have lidt at gå videre med.
mvh
Avatar billede dex_dexter Nybegynder
11. november 2005 - 09:43 #2
if (e.Item.ItemIndex != -1 && e.Item.ItemIndex == grid.EditItemIndex)
uhm, jeg kan ikke få den til at hoppe ind id en if,
e.Item.ItemIndex bliver aldrig lig grid.EditItemIndex.

det er meget underligt må jeg indrømme...
e.Item.ItemIndex er altid lige med antal elementer i mit grid, også når jeg trykker på edit(og felterne kommer fint frem)
Avatar billede snepnet Nybegynder
11. november 2005 - 09:46 #3
kan jeg se hele metoden?
mvh
Avatar billede dex_dexter Nybegynder
11. november 2005 - 09:56 #4
private void DataGrid1_EditCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
        {
            DataGrid1.EditItemIndex = e.Item.ItemIndex;
            Adapter.Fill(set2);
            DataGrid1.DataBind();
        }

        private void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
        {
            if (e.Item.ItemType == ListItemType.Item ||
                e.Item.ItemType == ListItemType.AlternatingItem)
            {
  if (e.Item.ItemIndex != -1 && e.Item.ItemIndex == grid.EditItemIndex)
        {
        CheckBox AdminCheck = e.Item.Cells[4].Controls[0] as CheckBox;
        AdminCheck.checked = true;
        }


                        }

den stump kode burde checke checkboxen af når jeg går i edit mode, men som sagt så matcher if sætningen slet ikke
Avatar billede dex_dexter Nybegynder
11. november 2005 - 10:01 #5
hovsa, grid skal være DataGrid1 :)
Avatar billede snepnet Nybegynder
11. november 2005 - 10:01 #6
nej det er sært .... hvorfor kommer du ikke derind ? (har du checket med debuggeren hvad det sker?)

mvh
Avatar billede snepnet Nybegynder
11. november 2005 - 10:03 #7
nåh ... du har flere grids :o)
virker det så?
mvh
Avatar billede dex_dexter Nybegynder
11. november 2005 - 10:03 #8
serveren har ikke debug enabled, desværre.
men hvis jeg smider dataen ud i textboxe kan jeg se at e.item.itemindex altid er antal elementer i mit datagrid, undtagen hvis jeg vælger det sidste element, så er det antal-1, det er meget underligt
Avatar billede dex_dexter Nybegynder
11. november 2005 - 10:04 #9
jeg har kun 1 grid, havde bare lige hevet den forkerte paste lige i den linje ;)
Avatar billede snepnet Nybegynder
11. november 2005 - 10:06 #10
ja det lyder lidt besynderligt .... hvorfor udvikler du ikke lokalt - og lægger tingene op når du er færdig?
(så slipper du jo for alt muligt bøvl omkring serverrestriktioner etc).
mvh
Avatar billede dex_dexter Nybegynder
11. november 2005 - 10:13 #11
bliver nød til at gøre det på den her måde.

hm.. det er meget besynderligt, e.item.itemindex beholder den værdi den har fået på et tidspunkt, dvs den skifter lidt imellem at være -1 eller 28.
jeg forstår det ikke
Avatar billede snepnet Nybegynder
11. november 2005 - 10:15 #12
du må skrive den ud her:
private void DataGrid1_EditCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
        {
            DataGrid1.EditItemIndex = e.Item.ItemIndex;
            Adapter.Fill(set2);
            DataGrid1.DataBind();
        }
og se hva du får, og hvad der sker.
mvh
Avatar billede dex_dexter Nybegynder
11. november 2005 - 10:19 #13
i editcommand virker den rent faktisk
Avatar billede snepnet Nybegynder
11. november 2005 - 10:21 #14
så må der jo ske noget mellem din editcommand kører, og din databinding kører... kører du eventuelt databinding flere gange?
mvh
Avatar billede dex_dexter Nybegynder
11. november 2005 - 10:28 #15
jeg fylder dataset og binder grid når siden bliver bygget, og i editcommand, og det er det.
Avatar billede snepnet Nybegynder
11. november 2005 - 10:33 #16
og du har også sådan en her på:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            BindGrid();
        }
    }

jeg skal ikke kunne sige hvorfor det driller.... hvis din variabel har den værdi den skal have i din editcommand, må du bare gemme værdien i en anden variabel som du så kan bruge i databindingrutinen.

men ellers prøv lige det eksempel jeg sendte dig - og se om det virker hos dig.

mvh
Avatar billede dex_dexter Nybegynder
11. november 2005 - 11:04 #17
hm.. nu har jeg fået overført værdien vha. en anden variable, men jeg kan ikke helt finde ud af hvordan man finder det rigtige element.

du har skrevet:
TextBox tb = e.item.Cells[1].Controls[0] as TextBox;
så burde jeg jo også kunne skrive:
CheckBox Cb = e.item.Cells[3].Controls[0] as CheckBox;
der er 2 read only textfelter og et alm textfelt foran.

men jeg kan ikke få fat i mit objekt ligemeget hvad jeg skriver, får at vide at index er out of bounds.
Avatar billede snepnet Nybegynder
11. november 2005 - 11:08 #18
det er 0-indekseret, så du skal skrive
CheckBox Cb = e.item.Cells[2].Controls[0] as CheckBox;
hvis du vil have fat i celle nummer 3.
hvis du har andre kontroller i feltet kan det så være nødvendigt at justere på Controls[X] også.
men ... hvis du laver det til en templatekolonne kan du give checkboksen et id, of få fat i den med :

CheckBox cb = e.Item.FindControls("checkBoxId") as CheckBox;

mvh
Avatar billede dex_dexter Nybegynder
11. november 2005 - 11:26 #19
hm.. ja, jeg får sådan set bare en fin fejl som siger:
Object reference not set to an instance of an object på linjen hvor jeg piller med det objekts proberties, det vil jeg mene betyder at jeg ikke har fat i checkboxen.
jeg har dobbelttjekket hvad den checkbox hedder, hvor kan man ellers gå fejl her?
Avatar billede snepnet Nybegynder
11. november 2005 - 11:29 #20
har du lavet en EditItemTemplate - eller forsøger du stadig at få fat i den pr. index.
og ja - det betyder at du ikke har fat i checkboxen.
mvh
Avatar billede dex_dexter Nybegynder
11. november 2005 - 12:03 #21
det er en templatecolumn hvor der er en checkbox i itemtemplate, og en i edititemtemplate
Avatar billede snepnet Nybegynder
11. november 2005 - 12:14 #22
må jeg se aspx'en, og den linie du bruger til at forsøge at få fat i tekstboksen med.
mvh
Avatar billede dex_dexter Nybegynder
11. november 2005 - 12:20 #23
<asp:TemplateColumn HeaderText="Admin">
                            <ItemTemplate>
                                <asp:CheckBox id="AdminList_Chk" runat="server" Enabled="False"></asp:CheckBox>
                            </ItemTemplate>
                            <EditItemTemplate>
                                <asp:CheckBox id="AdminEdit_Chk" runat="server"></asp:CheckBox>
                            </EditItemTemplate>
                        </asp:TemplateColumn>


forsøger at få fat i den med

        private void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
        {
           
            if (e.Item.ItemType == ListItemType.Item ||
                e.Item.ItemType == ListItemType.AlternatingItem)
            {
               


                if (tempvar != -1 && tempvar == DataGrid1.EditItemIndex)//grid er i edit tilstand
                {
                   
                CheckBox AdminEditChk = e.Item.FindControl("AdminEdit_Chk") as CheckBox;

                AdminEditChk.Checked = true;
               

            }


min editcommand ser sådan her ud:


        private void DataGrid1_EditCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
        {
            DataGrid1.EditItemIndex = e.Item.ItemIndex;
            tempvar = e.Item.ItemIndex;
            Adapter.Fill(set2);
            DataGrid1.DataBind();


og min page_load


        private void Page_Load(object sender, System.EventArgs e)
        {
            if (!IsPostBack)//if its not a refresh
            {
                Adapter.Fill(set2);
                DataGrid1.DataBind();
            }
           
        }
Avatar billede snepnet Nybegynder
11. november 2005 - 12:26 #24
mm.. synes ikke lige jeg kan se hvad der er balladen.... har du prøvet det eksempel jeg sendte - og kan du få det til at virke?
mvh
Avatar billede dex_dexter Nybegynder
11. november 2005 - 12:37 #25
jeg er lige igang med at lege rundt med det, det virker direkte ud af kassen, men prøver at udvide det til en checkbox også
Avatar billede dex_dexter Nybegynder
14. november 2005 - 09:03 #26
if (e.Item.ItemType == ListItemType.Item ||
                e.Item.ItemType == ListItemType.AlternatingItem)
            {


lige _der_ er problemet.

hvis jeg flytter koden for at finde ud af om man er i edit ud ovenover den kodeblok så virker det som det skal.

svar lige, du skal have points og mange tak for din tid og din hjælp.
Avatar billede snepnet Nybegynder
14. november 2005 - 09:21 #27
svar kommer her ....
underligt forhold det med itemtypechecket giver bøvl ?!?
mvh
Avatar billede dex_dexter Nybegynder
14. november 2005 - 10:08 #28
svaret kom til mig da jeg stod og gloede på kaffemaskinen her til morgen, itemtype hedder jo edititem når man trykker på editknappen.
du har ikke det tjek i din kode, og derfor virker den som det skal....
har tilføjet edititem til listen over ting den skal tjekke for, og nu kører det.

dum fejl fra min side, men det er en af de ting man altid glemmer at tjekke for :-)
Avatar billede snepnet Nybegynder
14. november 2005 - 10:15 #29
HAHA - ja jeg kunne unægteligt også godt have været lidt mere vågen der :oD
.... tilsyneladende et bevis for at 4 øjne ikke altid ser bedre end 2 :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