Avatar billede nat Nybegynder
15. marts 2007 - 14:30 Der er 8 kommentarer og
1 løsning

C#.net warning ved delete i datagrid

Hej Eksperter,

Jeg har et datagrid hvor man kan slette en række, er det muligt at lave en advarsel når brugeren klikker på slet, således at denne kan annulere handlingen eller fortsætte med at slette?

Hvis ja, hvordan?
Avatar billede crazysnap Seniormester
15. marts 2007 - 16:37 #1
Hej nat,

Jeg går udfra det er en ASP.NET side du er ved at lave. Du kan bruge javascript til at advare brugeren når han trykker på slet-knappen. For at gøre dette skal du tilføje en OnClick attribute på slet-knapperne i "slet"-søjlen på datagrid'en  (f.eks. under runtime, ved at fange ItemCreated event'en på datagrid'en). Det ser f.eks. sådan ud:



//Sætter ItemCreated event'en op for DataGrid1
private void InitializeComponent()
{
      this.DataGrid1.ItemCreated += new System.Web.UI.WebControls.DataGridItemEventHandler(this.DataGrid1_ItemCreated);
}


//Selve ItemCreated event'en
private void DataGrid1_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
      int intButtonCell = 0; //Indeks for knap-søjlen

      Button btnDel = e.Item.Cells[intButtonCell].Controls[0] as Button;

      if(btnDel != null)
      {
          btnDel.Attributes.Add("OnClick", "return confirm('Er du sikker på du vil slette den række?')");
      }
}


Håber det var det du søgte! :)


Mvh.

- Snap
Avatar billede nat Nybegynder
16. marts 2007 - 14:39 #2
Jo tak det er det :o)

Men når jeg prøver at kører det så fejler den på index:

System.ArgumentOutOfRangeException: Det angivne argument lå uden for det gyldige værdiområde.\r\nParameternavn: index\r\n 

Jeg har 9 koloner i datagridet, og har delete i den sidste, og har derfor sat index til at være = 8
Avatar billede crazysnap Seniormester
16. marts 2007 - 15:14 #3
Hej nat,

Det lyder umiddelbart korrekt, der skal dog også tages hensyn til hidden columns. Så hvis du har en hidden column skal du trække yderligere en fra indexet (så det bliver 7). Bliver kolonnerne lavet ved designtime eller under runtime (altså dynamisk)?


Mvh.

- Snap
Avatar billede nat Nybegynder
18. april 2007 - 10:26 #4
Undskyld mit sene respons, men:

der er ingen hidden columns, så slet-knappen ligger på index 8. Datagridet bliver lavet ved designtime (kolonnerne er altså ikke autogenereret).
Avatar billede crazysnap Seniormester
18. april 2007 - 11:48 #5
Hej nat,

Ja det er et stykke tid siden, men jeg kan da så fortælle dig hvorfor det ikke virker hos dig. Mit eksempel forudsatte du ikke havde nogen header på dit datagrid (ikke særlig pædagogisk), så hvis du sætter følgende if sætning rundt om dit kode i ItemCreated event'en burde det virke som forventet:


if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.EditItem)
{
    //Kode
}



Med mit tidligere eksempel bliver det altså:



//Selve ItemCreated event'en
private void DataGrid1_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
      if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType ==  ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.EditItem)
      {
        int intButtonCell = 0; //Indeks for knap-søjlen

        Button btnDel = e.Item.Cells[intButtonCell].Controls[0] as Button;

        if(btnDel != null)
        {
            btnDel.Attributes.Add("OnClick", "return confirm('Er du sikker på du vil slette den række?')");
        }
    }
}


Som du kan se sørges der for at det item der creates ikke er et header-item for det har jo ikke nogen knap tilknyttet. Det medfører en exeption på ".Controls[0]" da den så ikke indeholder nogen controls.


Håber det virker nu med dette fix! :)


Mvh.

- Snap
Avatar billede nat Nybegynder
18. april 2007 - 14:07 #6
Hmmm, den bliver flot lig med Header, og springer if-sætningen over. Men næste gang når den bliver lig med Item, opstår fejlen igen med at System.ArgumentOutOfRangeException: Det angivne argument lå uden for det gyldige værdiområde.\r\nParameternavn: index\r\n - og sletter derefter blot rækken
Avatar billede crazysnap Seniormester
18. april 2007 - 14:38 #7
Hej nat,

Hmm, nu begynder det at blive lidt mærkeligt synes jeg. Det burde virke med den beskrivelse jeg har givet. Idet det nu kan være svært at finde fejlen har jeg lavet en lille testside til dig som sætter det hele op, så kan du jo sammenligne og finde fejlen. :)


HTML-scriptet:


<%@ Page Language="C#" AutoEventWireup="true" CodeFile="DataGridTest.aspx.cs" Inherits="DataGridOnClickTest_DataGridTest" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.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="DataGridTest" runat="server"
        Width="300px" CellPadding="4" AutoGenerateColumns="False" ForeColor="#333333" GridLines="None" OnItemCreated="DataGridTest_ItemCreated" OnItemCommand="DataGridTest_ItemCommand">
        <SelectedItemStyle Font-Bold="True"></SelectedItemStyle>
        <AlternatingItemStyle BackColor="White"></AlternatingItemStyle>
        <Columns>
            <asp:BoundColumn HeaderText="TestText" DataField="TestText"></asp:BoundColumn>
            <asp:ButtonColumn ButtonType="PushButton" CommandName="Delete" HeaderText="DeleteRow" Text="Delete"></asp:ButtonColumn>
        </Columns>                             
    </asp:datagrid>
    </div>
    </form>
</body>
</html>



Tilhørende backend C# kode:



using System;
using System.Data;
using System.Configuration;
using System.Collections;
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 DataGridOnClickTest_DataGridTest : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            DataTable dt = CreateTableHeader();
            DataSet dst = PopulateTable(dt);
            Session["DataSet"] = dst;
        }

        DataSet ds = Session["DataSet"] as DataSet;
        refreshDataGrid(ds);
    }

    private DataTable CreateTableHeader()
    {
        DataTable dtContents = new DataTable();
        dtContents.Columns.Add("TestText");
        dtContents.Columns.Add("DeleteRow");
        return dtContents;
    }

    private DataSet PopulateTable(DataTable dtContents)
    {
        for (int i = 0; i < 5; i++)
        {
            DataRow dr = dtContents.NewRow();
            dr[0] = "Test " + i.ToString();
            dtContents.Rows.Add(dr);
        }

        DataSet ds = new DataSet();
        ds.Tables.Add(dtContents);
        ds.Tables[0].TableName = "Contents";

        return ds;
    }

    private void refreshDataGrid(DataSet ds)
    {
        if (ds != null && ds.Tables[0].Rows.Count > 0)
        {
            DataGridTest.DataSource = ds.Tables[0].DefaultView;
            DataGridTest.DataMember = "Contents";
            DataGridTest.DataBind();
        }
    }


    protected void DataGridTest_ItemCreated(object sender, DataGridItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.EditItem)
        {
            int intButtonCell = 1; //Indeks for knap-søjlen

            Button btnDel = e.Item.Cells[intButtonCell].Controls[0] as Button;

            if (btnDel != null)
            {
                btnDel.Attributes.Add("OnClick", "return confirm('Er du sikker på du vil slette den række?')");
            }
        }
       
    }

    protected void DataGridTest_ItemCommand(object source, DataGridCommandEventArgs e)
    {

    }

}



Håber det er nok til at kunne finde fejlen! :)


Mvh.

- Snap
Avatar billede nat Nybegynder
01. oktober 2008 - 08:20 #8
crazysnap smider du ikke et svar, så får du pont. Undskyld den sene tilbagemelding, men har været på barsel og har ikke tjekket denne side.
Avatar billede crazysnap Seniormester
01. oktober 2008 - 09:35 #9
Hej nat,

Håber du får/fik løst problemet, svaret kommer her.

Mvh.
CS

ps. tillykke med den lille. :)
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
Kurser inden for grundlæggende programmering

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