Avatar billede barn Nybegynder
10. april 2006 - 21:46 Der er 9 kommentarer

Datagrid med usynlige kolonner

Jeg har lavet et datagrid og bundet et datasæt til, nogen af kolonnerne har jeg valgt skal være usynlige (id/nøgle kolonner).

Når jeg sidenhen vil opdatere/edit en række, er indholdet af de usynlige kolonner tomt.

Jeg kan så forstå at hvis man vælger at det skal være usynlige i kolonnen property, så bliver kolonnen slet ikke renderet. Og at jeg i stedet skulle bruge et css style på de kolonner jeg vil have usynlige og stadigvæk have adgang til dem.

Så er mit spørgsmål nu, hvad er fidusen med at have en kolonne som ikke bare er usynlig for brugeren, men også for proggramøren?

Og er der nogen som har en anden løsning til hvordan jeg kunne gribe det an ?

Bemærk at min nøgle i datasættet er en fler-kolonne nøgle så jeg kan vidst ikke nøjes med at bruge datakey property'en i datagrid'et.


Erik
Avatar billede snepnet Nybegynder
10. april 2006 - 22:58 #1
du har fin adgang til dem programmatisk... der er ikke noget der er usynligt serverside.
mvh
Avatar billede snepnet Nybegynder
10. april 2006 - 22:59 #2
nu ved jeg ikke hvordan du har lavet det, men du kan få et eksempel hvis det er ... bruger du ikke 2.0?
mvh
Avatar billede kak Nybegynder
11. april 2006 - 08:45 #3
Jeg har selv haft samme problem, og løst det ved at sætte tekst-farven hvis (som er min baggrundsfarve), lave feltet readonly og sørge for, at det ikke medtages når du er i edit-mode. F.eks. sådan her...

<asp:BoundField ItemStyle-ForeColor="white" DataField="ID" HeaderText="" InsertVisible="False" ReadOnly="True" SortExpression="ID" />

Ok, man kan så se en smal kolonne der ikke indeholder noget synligt for brugere, men der virker.
Avatar billede barn Nybegynder
11. april 2006 - 14:42 #4
Først en kort kommentar til snerpet; Jeg bruger ikke 2.0, min fejl at jeg ikke oplyste det. Og ja, jeg HAR adgang til kolonnerne programmatisk, -indholdet er bare tomt, hvilket undrer mig såre, og som jeg ikke rigtigt kan bruge til noget.  Min problem er det samme som beskrevet i disse tråde:

http://www.codecomments.com/archive317-2005-3-431231.html
http://www.codecomments.com/archive289-2005-2-408840.html

Det som jeg bemærkede mig var følgende: Hidden columns don't get rendered to the client. If you need to get the
value after postback, hide the column with css rule display:none.


Min kode (stumper) ser ud som følgende:

<asp:datagrid id="MyDataGrid" runat="server" OnItemDataBound="MyDataGrid_ItemDataBound" AutoGenerateColumns="False"
                                OnUpdateCommand="MyDataGrid_Update" OnCancelCommand="MyDataGrid_Cancel" OnEditCommand="MyDataGrid_Edit"
                                OnDeleteCommand="MyDataGrid_Delete" AllowSorting="True" HeaderStyle-BackColor="LightGrey"
Font-Name="arial" CellPadding="3" BorderWidth="1px" BorderColor="Black" EditItemStyle-BackColor="#ffff99"
Font-Names="arial">
<EditItemStyle BackColor="#FFFF99"></EditItemStyle>
<HeaderStyle Font-Bold="True" BackColor="LightGray"></HeaderStyle>
<Columns>
                                    <asp:EditCommandColumn ButtonType="LinkButton" UpdateText="Gem" CancelText="Fortryd" EditText="Rediger">
                                        <HeaderStyle Wrap="False"></HeaderStyle>
                                        <ItemStyle Wrap="False"></ItemStyle>
                                    </asp:EditCommandColumn>
                                    <asp:BoundColumn DataField="id" HeaderText="Id"></asp:BoundColumn>
                                    <asp:BoundColumn Visible="False" DataField="aki" HeaderText="aki"></asp:BoundColumn>
                                    <asp:BoundColumn DataField="tlfnumber" HeaderText="Telefonnummer"></asp:BoundColumn>
                                   

og i min code behind:

string id = e.Item.Cells[1].Text;
//eller
//string id = ((TextBox)e.Item.Cells[1].Controls[0]).Text;

Men måske laver jeg en andenslags usynlighed på mine kolonner end hvad snerpet havde forestillet sig ?

Til Kak:
Så kan jeg bedre lide idéen med at gøre det usynligt med en css style, det virker mere "elegant". 

Men spørgsmålet består stadigvæk, hvorfor have en usynlig kolonne som man (jeg ihvertfald...) ikke kan bruge til noget.
Avatar billede snepnet Nybegynder
11. april 2006 - 14:57 #5
prøv det her eksempel:

// i aspx'en

<asp:DataGrid ID="grid" runat="server" AutoGenerateColumns="false" OnItemDataBound="grid_ItemDataBound">
    <Columns>
    <asp:BoundColumn DataField="Number" Visible="false">
    </asp:BoundColumn>
    <asp:BoundColumn DataField="Text">
    </asp:BoundColumn>
    </Columns>
</asp:DataGrid>
<br />
<asp:Button ID="btnPostBack" runat="server" OnClick="btnPostBack_Click" Text="Button" />

// og lidt kode - page_load
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        grid.DataSource = DAL.Get10Data(10);
        grid.DataBind();
    }
}

// handler til click-event på knappen
protected void btnPostBack_Click(object sender, EventArgs e)
{
    foreach (DataGridItem item in grid.Items)
    {
        Response.Write(item.Cells[0].Text + "<br />");
    }
}

// en klasse til at hente data igennem
public class DAL
{
    public static IList Get10Data(int rows)
    {
        IList liste = new ArrayList();
        for (int i = 0; i < rows; i++)
        {
            liste.Add(new Data("TEXT_" + i.ToString(), i));
        }
        return liste;
    }
}

// og et dto
public class Data
{
    private string m_Text;

    public string Text
    {
        get { return m_Text; }
        set { m_Text = value; }
    }

    private int m_Number;

    public int Number
    {
        get { return m_Number; }
        set { m_Number = value; }
    }

    public Data(string text, int number)
    {
        m_Text = text;
        m_Number = number;
    }
}

det skulle meget gerne - efter et klik på knappen - give dig et output hvor du både ser tabellen, og over den indholdet af den usynlige kolonne såfremt du har viewstate enabled.
du kan self. også løse det med et disabled viewstate såfremt du databinder hver gang.

lad mig høre om du kan få det til at fungere.

mvh
Avatar billede barn Nybegynder
11. april 2006 - 15:00 #6
Jeg må nok hellere understrege en gang til at det er når jeg er i edit mode, når jeg IKKE er i edit mode er værdierne skam fyldt ud.
Avatar billede snepnet Nybegynder
11. april 2006 - 15:34 #7
så gør sådan her:

<asp:DataGrid ID="grid" runat="server" AutoGenerateColumns="False" OnItemDataBound="grid_ItemDataBound" OnEditCommand="grid_EditCommand" OnUpdateCommand="grid_UpdateCommand">
    <Columns>
    <asp:TemplateColumn Visible="false">
        <ItemTemplate>
            <asp:Label ID="lblNumber" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.Number") %>'></asp:Label>
        </ItemTemplate>
        <EditItemTemplate>
            <asp:Label ID="lblNumber" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.Number") %>'></asp:Label>
        </EditItemTemplate>
    </asp:TemplateColumn>
    <asp:BoundColumn DataField="Text" />
        <asp:EditCommandColumn CancelText="Cancel" EditText="Edit" UpdateText="Update"></asp:EditCommandColumn>
    </Columns>
</asp:DataGrid>

og i din updatehandler:
protected void grid_UpdateCommand(object source, DataGridCommandEventArgs e)
{
    foreach (DataGridItem item in grid.Items)
    {
        // find din label under din template
        Label label = item.FindControl("lblNumber") as Label;
       
        // udskriv
        if (label != null)
        {
            Response.Write(label.Text + "<br />");
        }
    }

    // den er der klikket på
    Label l = e.Item.FindControl("lblNumber") as Label;
    if (l != null)
    {
        Response.Write("Værdien i den skjulte kolonne : " + l.Text);
    }
   
    // databind dit grid
}

mvh
Avatar billede barn Nybegynder
11. april 2006 - 16:06 #8
Jeg fandt løsningen her: http://p2p.wrox.com/topic.asp?TOPIC_ID=8391

og essensen er:

When you use a standard bound column, .net creates the default textbox for editing.  This is happening for your ID column, but of course, you can't see it.  The name of the textbox will be whatever .net generates for the name as you've most likely seen in the output HTML.

The key is to make the hidden bound column also readonly.  Then the grid will not draw a text box for you and you can always access the value with Cells(0).Text no matter what mode that ItemType that DataGridItem is.

<asp:BoundColumn DataField="Item_ID" Visible="False" ReadOnly="True" />


Så visible skal være false, og readonly skal være true.

Men jeg havde så meget på fornemmelsen at datagriddet også ville lave textboxe for de skjulte kolonner at jeg forsøgte tilgå dem på begge måder

string id = e.Item.Cells[1].Text;
//eller
string id = ((TextBox)e.Item.Cells[1].Controls[0]).Text;

men ingen af dem virkede...  men efter jeg har sat readonly til true så virker

string id = e.Item.Cells[1].Text;

som forventet.

Ihh altså !

Tak ellers for indput
Avatar billede snepnet Nybegynder
11. april 2006 - 16:36 #9
jeg synes nu stadig at sådan noget som dette :
item.FindControl("someid")
er nemmere at holde styr på - i forhold til indexering pr. nummer.
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