Avatar billede idiotbarn Nybegynder
29. juli 2005 - 13:08 Der er 15 kommentarer og
1 løsning

Datagrid længde af tekst og layout

Jeg har en datagrid med edit og delete, som jeg binder data til, men én af kolonnerne kan godt komme til at blive temmelig lang, og hvis teksten i denne er længere en fx 20 tegn, vil jeg gerne ha der kun vises 20 tegn og "...". Jeg har prøvet at løse det i GalleryGrid_OnItemDataBound i efterfølgende kode. Jeg kan godt skrive en tekst i den, og det fungere også, men så snart jeg trykker edit kommer fejlen:
System.ArgumentOutOfRangeException
i linien:

TextBox t2 = (TextBox)line.Cells[6].Controls[0];


Jeg har koden herunder:

"Select Id,HeadLine,Text from Gallerys where SiteId="+Session["SiteId"].ToString();
...Databind...


protected void GalleryGrid_OnItemDataBound(object sender, DataGridItemEventArgs e)
          {
          //Hides ID column (http://eksperten.dk/spm/534513)
          e.Item.Cells[4].Visible = false;
          String Text = e.Item.Cells[6].Text;

          if(Text.Length>20)
          {
          Text=Text.Substring(0,20)+"...";
          }

          e.Item.Cells[6].Text=Text;

          //Comfirm box:
            if(e.Item.FindControl("DeleteLink") != null)
            {
              ((LinkButton) e.Item.FindControl("DeleteLink")).Attributes.Add("onClick", "return confirm('Are you sure you wish to delete this item?');");

            }
          }


...

private void GalleryGrid_Edit(Object sender, DataGridCommandEventArgs e)
          {
          GalleryGrid.EditItemIndex = (int)e.Item.ItemIndex;
          BindData();
          DataGridItem line = GalleryGrid.Items[e.Item.ItemIndex];
          AddText=Session["AddText"].ToString();

          //AddText styrer om t2 skal bruges
          if(AddText.Equals("true")){
            TextBox t2 = (TextBox)line.Cells[6].Controls[0];
            t2.Width = Unit.Pixel(170);
            t2.Height = Unit.Pixel(70);
            t2.TextMode = TextBoxMode.MultiLine;
          }
          }

...

<asp:DataGrid id="GalleryGrid" runat="server" CellPadding="4" AllowPaging="True" PageSize="15" OnItemDataBound="GalleryGrid_OnItemDataBound" AutoGenerateColumns="True" OnUpdateCommand="GalleryGrid_Update" OnCancelCommand="GalleryGrid_Cancel" OnEditCommand="GalleryGrid_Edit" OnDeleteCommand="GalleryGrid_Delete" DataKeyField="Id">
            <HeaderStyle font-bold="True"></HeaderStyle>
            <EditItemStyle backcolor="PeachPuff"></EditItemStyle>
            <ItemStyle wrap="False" verticalalign="Top"></ItemStyle>
            <Columns>
                <asp:TemplateColumn>
                    <ItemTemplate>
                        <asp:linkbutton id="DeleteLink" runat="server" text="Delete" commandname="Delete" />
                    </ItemTemplate>
                </asp:TemplateColumn>
                <asp:EditCommandColumn ButtonType="LinkButton" UpdateText="Update" HeaderText="Text" CancelText="Cancel" EditText="Edit"></asp:EditCommandColumn>
                <asp:HyperLinkColumn Text="Edit/Add" DataNavigateUrlField="ID" DataNavigateUrlFormatString="EditGallery.aspx?Id={0}" HeaderText="Pictures"></asp:HyperLinkColumn>
                <asp:TemplateColumn>
                    <HeaderTemplate>
                        -
                    </HeaderTemplate>
                </asp:TemplateColumn>
            </Columns>
        </asp:DataGrid>
Avatar billede idiotbarn Nybegynder
29. juli 2005 - 13:11 #1
ups...ja spørgsmålet er jo så om i kan se en fejl i hvorfor jeg ikke kan gøre førnævnte?

Derudover, når jeg kører musen over edit,delete,update eller cancel, bliver de "bold" og kanterne i datagrid'et bevæger sig...hvordan undgår man det?
Avatar billede madschristensen Nybegynder
29. juli 2005 - 13:12 #2
Læg indholdet af hele feltet i en skult kolonne. Når du så trykker edit, kan du fylde disse data over i det felt der normalt er begrænset. (og tilbage i det andet når du gemmer).
Avatar billede idiotbarn Nybegynder
29. juli 2005 - 13:27 #3
problemet opstår først når jeg bruger:
e.Item.Cells[6].Text=Text;
herefter kan den udføre edit...den kan ikke finde kontrollen, efter jeg har smidt tekst i cellen...
Avatar billede idiotbarn Nybegynder
29. juli 2005 - 13:34 #4
det går godt...

det skulle selvfølgelig ha været:
herefter kan den IKKE udføre edit...den kan...
Avatar billede snepnet Nybegynder
29. juli 2005 - 15:20 #5
hej :o)

Der findes ikke nogen tekstboks på det tidpunkt du prøver at få fat i den(det er denne linie der fejler hos dig ikke?) :
TextBox t2 = (TextBox)line.Cells[6].Controls[0];

Det er først når griddet renderes igen, at tekstkboksen kommer ind (på rækken med samme index som edititemindex).

mvh
Avatar billede idiotbarn Nybegynder
31. juli 2005 - 15:36 #6
jo...lige præcis...havde godt på fornemmelsen det var derfor, men hvordan fikser man det?
Avatar billede snepnet Nybegynder
31. juli 2005 - 17:19 #7
hej igen :o)

du kan se en løsning her i 2 niveauer (hhv på den ene side, og ved brug af en customcolumn).

det er rimelig enkelt.

mvh
Avatar billede idiotbarn Nybegynder
31. juli 2005 - 23:45 #8
her siger du?
Avatar billede snepnet Nybegynder
01. august 2005 - 01:03 #9
Avatar billede snepnet Nybegynder
07. august 2005 - 00:50 #10
halløj - hvordan går det her?
... du får et svar hvis alt skulle være ok :o)
mvh
Avatar billede idiotbarn Nybegynder
08. august 2005 - 18:00 #11
Hej igen...har ikke rigtigt været ved computeren...men jeg har lidt to problemer, vi starter bare med den første...jeg har valgt at lave en customcolumn og når jeg trykker edit, kommer man til at redigere teksten ([tekst]...) (selvfølgeligt), jeg kalder en funktion der binder dataen til datagrid'et, men hvis jeg laver Truncate() funktionen som på siden  istedet, kan jeg så binde dataen i databasen til tekstfelterne i stedet for dataen i datagrid'et? Eller skal jeg lave 2 ekstra kollonner med tekstfelter der er gemt og så kopiere dataen derfra?
Avatar billede snepnet Nybegynder
08. august 2005 - 23:24 #12
umiddelbart lyder det mere som om du skal indbygge trunkeringsmuligheden på en måde, så du kan slå den fra på den række der er i editmode..... så tror jeg du kan komme uden om det uden at skulle kopiere.
mvh
Avatar billede idiotbarn Nybegynder
09. august 2005 - 01:24 #13
ja...men har du en god ide? bare teoretisk, for kan jeg aflæse nogen steder om man er i editmode? Jeg kan lave en egenskab i klassen, men den går vel tabt når jeg kalder funktionen der binder dataen?
Avatar billede snepnet Nybegynder
09. august 2005 - 03:14 #14
jeps - rækken er i editmode, hvis den index er = EditItemIndex, så i forb. med databinding kan du så sikre dig at den række der kan editeres - ikke får trunkeret teksterne - f.eks:

// i someDataGrid_ItemDataBound
if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
  if(!(e.Item.ItemIndex == someDataGrid.EditItemIndex))
  {
    // her tilføjer du så trunkering
  } 
}

mvh
Avatar billede idiotbarn Nybegynder
13. august 2005 - 15:41 #15
sejt...takker.
Avatar billede snepnet Nybegynder
13. august 2005 - 18:26 #16
det var 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