Avatar billede frets Nybegynder
17. august 2005 - 11:43 Der er 11 kommentarer og
1 løsning

Edit datagrid i datagrid

Jeg har et datagrid som indeholder et datagrid. Jeg ønsker at editere det inderste datagrid, men jeg får fejlen System.NullReferenceException: Objektreferencen er ikke indstillet til en forekomst af et objekt.

Mit inderste datagrid:
<asp:DataGrid id="dgScores" DataSource='<%# getScores(DataBinder.Eval(Container.DataItem, "round")) %>' runat="server" AutoGenerateColumns="False" OnEditCommand="dgScores_Edit">
    <Columns>
        <asp:EditCommandColumn EditText="Edit" CancelText="Fortryd" UpdateText="Gem"></asp:EditCommandColumn>
        <asp:BoundColumn DataField="teamname" HeaderText="Hold"></asp:BoundColumn>
        <asp:TemplateColumn>
            <ItemTemplate>
                <%# DataBinder.Eval(Container.DataItem, "score") %>
            </ItemTemplate>
            <EditItemTemplate>
                <asp:TextBox id="tbxScore" runat="server"><%# DataBinder.Eval(Container.DataItem, "score") %></asp:TextBox>
            </EditItemTemplate>
        </asp:TemplateColumn>
    </Columns>
</asp:DataGrid>


Codebihind:
    StoreView = new DataView(dtRounds);

    public void dgScores_Edit(Object sender, DataGridCommandEventArgs e) {
    dgScores.EditItemIndex = e.Item.ItemIndex;
    BindGrid();
}

void BindGrid() {
    dgScores.DataSource = StoreView;
    dgScores.DataBind();
}

Hvordan kan jeg editere et datagrid som er inden i et andet datagrid?
Avatar billede snepnet Nybegynder
17. august 2005 - 23:41 #1
hej frets :o)

hvis dit grid ligger i et andet grid kan du ikke bare lave en dekleration i din code-behind og tilgå det via den... det er et nyt grid for hvert item i dit ydre grid.

du kan godt i din eventhandler få fat i det - men så skal du f.eks. :

DataGrid innergrid = sender as DataGrid;
if(innergrid != null)
{
  // gør noget med dit grid
}

er det en handler på dit ydre grid du abbonerer på (ItemCommand) - kan du så finde dit innergrid i det aktuelle item med
DataGrid innergrid = e.Item.FindControl("dgScores") as DataGrid;
if(innerGrid != null)
{
// ...
}

mvh
Avatar billede frets Nybegynder
18. august 2005 - 15:28 #2
Kan du uddybe det lidt? Evt. med et lille eksempel, da jeg ikke helt er med på hvordan det skal gøres.
Avatar billede snepnet Nybegynder
18. august 2005 - 17:07 #3
klart - aspx:

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
      <asp:DataGrid ID="DataGrid1" runat="server" OnItemDataBound="DataGrid1_ItemDataBound">
          <Columns>
            <asp:TemplateColumn>
                <ItemTemplate>
                  <asp:DataGrid ID="DataGrid2" runat="server" OnItemCommand="DataGrid2_ItemCommand">
                      <Columns>
                        <asp:ButtonColumn Text="Button"></asp:ButtonColumn>
                      </Columns>
                  </asp:DataGrid>
                </ItemTemplate>
            </asp:TemplateColumn>
          </Columns>
      </asp:DataGrid></div>
    </form>
</body>
</html>

// code-behind
using System;
using System.Data;
using System.Collections.Generic;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page
{
  private List<SomeClass> m_List1;
  private List<SomeClass> m_List2;

  protected void Page_Load(object sender, EventArgs e)
  {
      m_List1 = new List<SomeClass>();
      m_List2 = new List<SomeClass>();
      for(int i=0; i<10; i++)
      {
        m_List1.Add(new SomeClass(i,i.ToString()));
        if(i%5==0)
            m_List2.Add(new SomeClass(i,i.ToString()));
      }

      DataGrid1.DataSource = m_List1;
      DataGrid1.DataBind();
  }

  protected void DataGrid1_ItemDataBound(object sender,DataGridItemEventArgs e)
  {
      if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
      {
        DataGrid innergrid = e.Item.FindControl("DataGrid2") as DataGrid;
        innergrid.DataSource = m_List2;
        innergrid.DataBind();
      }
  }
  protected void DataGrid2_ItemCommand(object source,DataGridCommandEventArgs e)
  {
      Response.Write("Command : " + e.CommandName + " on item " + e.Item.ItemIndex.ToString());
  }

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

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

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

listerne skal du ikke tage så tungt - er lavet med V2.0 generisk, men jeg går ud fra du har dine egne data at arbejde med.

mvh
Avatar billede frets Nybegynder
18. august 2005 - 17:55 #4
Jeg kan ikke lige se hvor den fanger det item jeg vil editere i det indersete grid.
Avatar billede snepnet Nybegynder
18. august 2005 - 19:16 #5
dit item ligger på e.Item - e er det andet argument til eventhandleren.
mvh
Avatar billede frets Nybegynder
20. august 2005 - 14:08 #6
Så er den der næsten. Nu mangler jeg bare at finde værdien af mit ydre grid, så jeg kan finde det rigtige rundenr. til brug ved rowfilter, men hvordan?
Avatar billede snepnet Nybegynder
20. august 2005 - 14:41 #7
du kan altid gå op igennem kontrolhierarkiet, og hvis du skal finde det datagriditem du "sidder i" kan du gå op igennnem kontrolhierakiet via namingcontainers til du finder den rigtige.

i dit tilfælde står du med et item i hånden, der ligger i et grid, der ligger i en celle i det griditem (ydre) du vil have fat i, så det bliver noget i denne stil:

DataGridItem outerItem = e.Item.NamingContainer.NamingContainer.NamingContainer as DataGridItem;
if(outerItem != null)
{
  // her kan du så gøre noget ved griddet
}

du må lige prøve dig frem til du finder det rigtige ;o)

eller kan du bare lægge en attribut på din innergrid, der fortæller dig det du skal vide - f.eks. i databoundhandleren fra tidligere:
(her forudsat at du har en værdi i datakilden du kan bruge som attribut)

// nå men ... i handleren fra tidligere

// find datagrundlag for aktuelt item i ydre grid (det der pt. bindes)
DataRowView data = e.Item.DataItem as DataRowView;
if(data != null)
{
  DataGrid innergrid = e.Item.FindControl("DataGrid2") as DataGrid;
  innergrid.DataSource = ... ;
  innergrid.Attributes.Add("SpecielValue", data["kolonnenavn"].ToString());
  innergrid.DataBind();
}

så kan du så kigge på attributten i handleren for clickeventet:

DataGrid innergrid = sender as DataGrid;
string specialValue = innergrid.Attrubutes["specialValue"];

... håber du har lidt at gå videre med nu.

mvh
Avatar billede snepnet Nybegynder
20. august 2005 - 14:44 #8
hov - det var vist i forbindelse med databindingen du skulle bruge det (misforstod dig muligvis.... troede du skulle bruge værdien i forbindelse med eventhandleren på dit innergrid), såhh... det er nok denne her du skal kigge på :

// find det datagrundlag der bruges til databindingen
DataRowView data = e.Item.DataItem as DataRowView;
if(data != null)
{
  // og træk den værdi ud du skal bruge - f.eks.:
  int rowId = (int)data["Id"]; // tilpas til kollonnenavn/type
}

mvh
Avatar billede frets Nybegynder
21. august 2005 - 21:03 #9
Jeg har lavet en atrribut på mit innergrid, men jeg har lidt problemer med at få værdien frem.
System.NullReferenceException: Objektreferencen er ikke indstillet til en forekomst af et objekt.

_dv.RowFilter = "round='" + innergrid.Attributes["specialValue"].ToString() + "'";
Avatar billede snepnet Nybegynder
21. august 2005 - 21:07 #10
lidt svært at sige hvad der er balladen der ... _dv kunne også være null.
men tag tingene et skridt ad gangen :
string sv = innergrid.Attributes["specialValue"].ToString();
_dv.RowFilter = ....
og check om du har attributten i html'en.
mvh
Avatar billede frets Nybegynder
21. august 2005 - 21:16 #11
Doh... det var en klassisk husk at der er forskel på StOrE og smÅ bogstaver, så det virker nu.

Smid et svar så du kan få nogle velfortjente point.
Avatar billede snepnet Nybegynder
21. august 2005 - 21:19 #12
:o) - godt det funger.
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

IT-JOB