[C#] Toevoegen delete knop aan row in DataGrid

Pagina: 1
Acties:
  • 120 views sinds 30-01-2008
  • Reageer

  • Raenius
  • Registratie: December 2003
  • Laatst online: 20-08-2021
Hey mensen,

Ik gebruik Borland C# Builder voor een project waar ik aan werk. Ik heb een database draaien op een SQL server en daar haal ik informatie uit o.a. een lijst met routers...nu wil ik op een form een DataGrid aanmaken die alle routers in de database laat zien met achter elke naam van de router een knopje met DELETE.

Ik ben nu al een paar dagen op zoek maar ik kan het echt niet vinden, heeft iemand een idee hoe dit moet?

Initialiseren van DataGrid
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
    private void WinForm3_Load(object sender, System.EventArgs e)
        {
            SqlConnection myConnection = new SqlConnection("user id=xxxxxxx;" +                                   "password=xxxxx;server=x.x.x.x;" +
                                       "Trusted_Connection=yes;" +
                                       "database=xxxxx; " +
                                       "connection timeout=30");

        try {
        SqlDataAdapter da = new SqlDataAdapter("SELECT name AS Router_Name FROM ROUTERS", myConnection);

        // create a new dataset
        DataSet ds = new DataSet();

        // fill dataset
        da.Fill(ds, "REMOVEROUTERS");
        // Attach DataSet to DataGrid
        //dataGrid1.DataSource = ds.DefaultViewManager;

        dataGrid1.DataSource = ds.Tables["REMOVEROUTERS"].DefaultView;

        // Close the Database connection
        myConnection.Close();
        }
        catch(Exception griderror)
        {
        myConnection.Close();
        MessageBox.Show(griderror.ToString(), "Error Message");
        }
        }
    }
}


Opbouwen DataGrid:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
           this.dataGrid1 = new System.Windows.Forms.DataGrid();
            ((System.ComponentModel.ISupportInitialize)(this.dataGrid1)).BeginInit();
            this.SuspendLayout();
            // 
            // dataGrid1
            //
            this.dataGrid1.CaptionText = "Removable Routers";
            this.dataGrid1.DataMember = "";
            this.dataGrid1.HeaderForeColor = System.Drawing.SystemColors.ControlText;
            this.dataGrid1.Location = new System.Drawing.Point(32, 32);
            this.dataGrid1.Name = "dataGrid1";
            this.dataGrid1.Size = new System.Drawing.Size(272, 240);
            this.dataGrid1.TabIndex = 0;


Iemand enig idee of een suggestie hoe ik dit voor elkaar kan krijgen?

Alvast bedankt!

- Raenius

http://www.catalogged.net/


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Ik denk niet dat dat mogelijk is in C# / WinForms. (Althans, niet met de gewone , standaard Grid).
In C# / WebForms is het wel mogelijk, maar ik denk niet dat je een een Button-type column kunt maken in een DataGrid. Je kan wel een TextBoxColumn en een BoolColumn aanmaken, maar ik vind niet direct iets over een ButtonColumn oid in WinForms.

Waarom maak je gewoon niet 1 knop naast je datagrid, waarmee je het geselecteerde record kunt verwijderen?

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Of anders kan je natuurlijk eens proberen om zelf zo'n ButtonColumn te maken...

https://fgheysels.github.io/


  • Raenius
  • Registratie: December 2003
  • Laatst online: 20-08-2021
Dat kan ik natuurlijk proberen maar de expertise omdat te doen heb ik denk ik (nog) niet...

Zou je iets meer kunnen vertellen over die eerste optie?

Alvast bedankt!

- Raenius

http://www.catalogged.net/


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Euh, die eerste optie is toch simpel?
Gewoon een button naast / onder / ... je datagrid zetten, en als er op geklikt wordt ga je checken of er een rij geselecteerd is.
Zoja -> verwijder de geselecteerde rij.

https://fgheysels.github.io/


  • Raenius
  • Registratie: December 2003
  • Laatst online: 20-08-2021
Oke ik heb het nu zo gedaan:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
private void RemoveRouterDelete_button_Click(object sender, System.EventArgs e)
        {
            System.Windows.Forms.DataGridCell selectedCell = dataGrid1.CurrentCell;
            object selectedItem = dataGrid1[selectedCell.RowNumber, selectedCell.ColumnNumber];
            string routername = Convert.ToString(selectedItem);
            DialogResult result;
            result = MessageBox.Show("Are you sure you want to delete this router: "+routername+"?","Delete Router...",MessageBoxButtons.OKCancel,MessageBoxIcon.Warning);
            if(result == DialogResult.OK)
            {

                try
                {

                 bool yes = DeleteRouter(routername);

                 if (yes ==true)
                 {
                 MessageBox.Show("Succes!");
                 }
                 else
                 {
                 MessageBox.Show("Failure!");
                 }
                 // Call function which:
                 // Connects to database   Done
                 // Updates database       Done
                 // Updates data source    
                 // Refreshes data source
                 // Refreshes Form
                }
                catch (Exception rmerror)
                {
                MessageBox.Show(rmerror.ToString(), "Error Message");
                }
            }
            else
            {
            }
        }

        private bool DeleteRouter(string routername)
        {
        //MessageBox.Show(routername);
        bool result = false;

        SqlConnection myConnection = new SqlConnection("user id=xxxx;" +
                                       "password=xxxxx;server=x.x.x.x;" +
                                       "Trusted_Connection=yes;" +
                                       "database=xxxxx; " +
                                       "connection timeout=30");
        SqlCommand myDeleteCommand= new SqlCommand("DELETE FROM ROUTERS WHERE name="+routername+"", myConnection);
        try
        {
        myConnection.Open();

        // try to execute delete command

        MessageBox.Show("Attempting Deletion", "Database Connection");
        myDeleteCommand.ExecuteNonQuery();

        MessageBox.Show("Succesfully completed SQL Query","Database Connection");
        result = true;

        // Database was succesfully updated, close connection
        myConnection.Close();

        // Refresh form

        this.Refresh();

        }
        catch(Exception delerror)
        {
         myConnection.Close();
         MessageBox.Show(delerror.ToString(), "Error Message");
        }
        
        return result;
        }


Alleen hij geeft nu nog een error aan bij het SQL statement, its met verkeerde columns....dit snap ik niet helemaal...

- Raenius

http://www.catalogged.net/


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Tja, je moet ook quotes zetten rond alfanumerieke waarden.

Daarnaast vraag ik me af waarom je anders nog dit doet:
code:
1
new SqlCommand("DELETE FROM tabel WHERE name = " + routername  + "");

en dan doel ik op die laatste + "".

Eigenlijk moet dat dus:
code:
1
new SqlCommand("DELETE FROM tabel WHERE name = '" + routername + "' ", ...);

(Let op de quotes).

Maar, het beste is eigenlijk dat jeparametrized queries gebruikt.

[ Voor 24% gewijzigd door whoami op 04-03-2004 09:01 ]

https://fgheysels.github.io/


Verwijderd

DELETE FROM ROUTERS WHERE name="+routername+"

Er bestaat geen kolom naam name, want dat is een alias die je hebt gebruikt in je eerste query. Je moet van name Router_Name maken.

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Verwijderd schreef op 04 maart 2004 @ 09:00:
Er bestaat geen kolom naam name, want dat is een alias die je hebt gebruikt in je eerste query. Je moet van name Router_Name maken.
Nee hoor, als je z'n eerste query bekijkt, zie je dat het net andersom is:
Hij heeft een alias router_name gemaakt voor de column name.

https://fgheysels.github.io/


  • Raenius
  • Registratie: December 2003
  • Laatst online: 20-08-2021
Als ik de quotes gebruik zoals je neerzet whoami dan geeft Borland aan dat hij nog quotes mist en runt hij niet.

Dionv: Dat werkte jammer genoeg niet gaf hetzelfde probleem.

ERG snelle replies trouwens mensen bedankt!

- Raenius

http://www.catalogged.net/


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Output je query eens naar het scherm ipv hem uit te voeren. Op die manier kan je ook nogal vlug zien wat er precies mis mee is.

Daarnaast kan ik je alleen aanbevelen om die parametrized queries te gebruiken. Het is misschien wat meer werk, maar het bespaart je achteraf veel problemen, en het kan de performance positief beinvloeden.

Oja, je hoeft ook niet steeds je naam onder je post te zetten, want dat leest irritant.

[ Voor 12% gewijzigd door whoami op 04-03-2004 09:09 ]

https://fgheysels.github.io/


  • Raenius
  • Registratie: December 2003
  • Laatst online: 20-08-2021
Oke ik ga gelijk met die geparametriseerde queries spelen kijken of dat werkt...

In ieder geval bedankt voor de hulp!

Even een iets ander vraagje wanneer ik iets verwijder uit mijn hoofdtabel dan geeft hij een error omdat er referenties (mbv foreign keys) naar andere tabellen staan...hoe kan ik dit het slimste doen zodat alle overige tabellen ook gelijk geleegd worden?

http://www.catalogged.net/


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Door je foreign key zodanig te maken dat je cascaded deletes hebt. (Je kan dit als optie aanvinken in enterprise manager, of anders moet je het via T-SQL doen).

T-SQL:
je zult ws eerst je bestaande foreign key moeten droppen, en daarna maak je hem opnieuw:
code:
1
2
3
alter table mytabel
add constraint fk_blaat FOREIGN KEY (foreign_key_veld)
REFERENCES tabel(primary_key_field) ON DELETE CASCADE

zoiets moet het ongeveer zijn. Ik heb het niet getest, maar in de Books Online van Sql Server vind je de juiste syntax wel terug mocht er iets niet aan kloppen.

https://fgheysels.github.io/


  • Raenius
  • Registratie: December 2003
  • Laatst online: 20-08-2021
Oke dan ga ik gelijk even zoeken in de enterpise manager of ik dat kan vinden..

Parametriserende queries werken perfect en snel! thanks! (nu alleen alle queries opnieuw zo definieren :(

Weer bedankt!

http://www.catalogged.net/


  • Raenius
  • Registratie: December 2003
  • Laatst online: 20-08-2021
Ik heb een aantal probleempjes gehad met de db maar nu werkt het in ieder geval weer :)

Cascade delete related records aangevinkt en draaien als een trein!

Heel erg bedankt en nu ga ik maar al mijn queries ombouwen! :)

http://www.catalogged.net/

Pagina: 1