Bonjour, je vais clarifier le titre car je ne sais pas vraiment comment le formuler.

J'ai une base de données sqlite3, une interface GTK+ et un programme en c.

Ce programme exécute une fonction à l'ouverture qui :
  • exécute une requête sql pour compter le nombre d'enregistrements d'une table t_fruits. On appelle n ce nombre d'enregistrements.
  • créer n fois dans mon interface une ligne avec 3 champs textes correspondants aux colonnes de la table t_fruits (id, nom, couleur, poids) suivie d'un bouton modifier. Le champ id n'étant pas inséré dans un champ de l'interface.


Par exemple si j'ai 3 enregistrements dans ma table, mon interface affiche :

Banane | Jaune | 100g | "bouton modifier"
Pomme | Rouge | 80g | "bouton modifier"
Orange | Orange | 90g | "bouton modifier"

Jusqu'ici aucun problème. Ce que j'avais en tête était de pouvoir modifier la valeur d'une colonne d'un enregistrement en cliquant sur le bouton modifier.
Par exemple je veux changer la couleur de pomme de rouge à verte, je clique sur le bouton modifier de la ligne correspondante, une fenêtre s'ouvre et me propose de modifier l'enregistrement.

C'est ici que ça coince. Je n'avais pas pensé que chaque champ texte et chaque bouton n'étaient que des clones sans identifiant unique.

Dans un premier tant je me suis dis que je devrai rajouter un champ texte à gauche des trois autres pour stocker l'id de chaque enregistrement. Je rendrai ce champ texte invisible.

Mais ensuite comment faire ? Je me demande s'il existe un moyen de donner un identifiant unique à chaque bouton ? Cela permettrait de donner comme identifiant le même que celui de l'enregistrement correspondant et ainsi je pourrai configurer ma requête sql.

J'ai aussi pensé à créer une variable pour chaque bouton mais le nombre de ligne est aléatoire. Il faudrait créer beaucoup de variables. Ça me parait très lourd et peu propre.

Est-ce qu'il y a un outil dont je n'ai pas connaissance qui permet de faire ce que je cherche d'une manière propre est efficace ?
Avez-vous des pistes à me proposer ?

Voici le code qui créer les champs si ça peut aider :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
//Entries
	sql="SELECT COUNT(*) FROM t_fruits;";
	tempChar=getSqlResult(dbName,sql);//récupérer le nombre d'enregistrement dans la table t_fruits
	tempInt=atoi(tempChar);
 
	//Créer et afficher tous les champs textes et leur contenu dans gridTask
	for(i=0;i<tempInt;i++)//afficher tous les enregistrements dans des champs textes
	{
		for(j=0;j<=2;j++)
		{
			//Création des champs texte
			grid=gtk_builder_get_object(builder,"gridTask");
			entryText=G_OBJECT(gtk_entry_new());
			gtk_grid_attach(GTK_GRID (grid),GTK_WIDGET(entryText),j,i+2,1,1);
 
			sql=(char *)malloc(100);
 
			//Remplissage des champs texte
			strcpy(sql,"SELECT Nom,Couleur,Poids,List FROM t_fruits WHERE Id=");
			sprintf(tempChar,"%d",i+1);
			strcat(sql,tempChar);
			strcat(sql,";");
			columnSql=j;
			setEntryText(dbName,sql,entryText,columnSql);
		}
                //Création du bouton modifier en fin de ligne
		button=G_OBJECT(gtk_button_new_with_label("Modify"));
		gtk_grid_attach(GTK_GRID (grid),GTK_WIDGET(button),j,i+2,1,1);
	}
Merci d'avance.