Récupérer les statuts de checkboxes dans un tableau

Résolu
Majestick Messages postés 19 Date d'inscription jeudi 26 février 2015 Statut Membre Dernière intervention 2 octobre 2015 - 1 oct. 2015 à 17:11
Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024 - 2 oct. 2015 à 09:50
Bonjour à tous,
Mon problème est le suivant : je veux récupérer le statut de toutes mes cases à cocher.
Seulement, je ne récupère le statut que de la dernière ligne qui a été sélectionné.
Voici le code de ma classe qui gère tout ceci :
/// <summary>
/// Form for CVault Administration
/// </summary>
public partial class FrmCVault : Form
{
	#region Properties

	/// <summary>
	/// Base filter lists
	/// </summary>
	//TODO: Change to a CVaultConfiguration Class
	public List<BASEFILTER> lBaseFilters { get; private set; }
	public List<SITE> lSites { get; private set; }
	public List<CONFIGURE> lConfigures{ get; private set; }

	#endregion

	#region Constructors

	/// <summary>
	/// Constructor
	/// </summary>
	public FrmCVault()
	{
		InitializeComponent();
		this.lBaseFilters = null;
		this.lSites = null;
		this.lConfigures = null;
	}

	#endregion

	#region Private methods

	#region Compare byte[]

	/// <summary>
	/// Compare two byte[]
	/// </summary>
	/// <param name="b1"></param>
	/// <param name="b2"></param>
	/// <returns></returns>
	private bool Compare(byte[] b1, byte[] b2)
	{
	   // return Encoding.ASCII.GetString(b1) == Encoding.ASCII.GetString(b2);
		return b1.SequenceEqual(b2);
	}
	#endregion

	#region Fill the table with Basefilter data

	/// <summary>
	/// Fill the table with Basefilter data
	/// </summary>
	private void retrieveData()
	{
		EVPTProviderBase provider = DataRepository.EVPTProvider;

		ObjectDataSet ds = provider.GetBaseFilter();

		if (ds != null)
		{
			this.lBaseFilters = ds.arBASEFILTER.ToList();
			this.lSites = ds.arSITE.ToList();
			this.lConfigures = ds.arCONFIGURE.ToList();
		}
	}

	#endregion

	#region Load Base filter data from DB
	/// <summary>
	/// Load data from the database 
	/// </summary>
	private void LoadDataSource()
	{
		CVaultDataSource.Rows.Clear();

		if (this.lBaseFilters != null)
		{
			var filters = from filterBase in this.lBaseFilters
						  orderby filterBase.EVPTCODE
						  select new { Id = filterBase.ID, cvault = filterBase.CVAULTCODE, evpt = filterBase.EVPTCODE, desc = filterBase.EVPTDESIGNATION, duration = filterBase.DURATION, time = filterBase.ETDTIME };

			var sitesDB = from sites in this.lSites
						  orderby sites.KEY
						  select new { SiteKey = sites.KEY, SiteId = sites.ID };

			var configs = from config in this.lConfigures
						  select new { site = config.SITE_ID, baseF = config.BASEFILTER_ID };

			object[][] table = new object[filters.Count()][];
			int i = 0;

			foreach (var item in filters)
			{
				int j = 0;
				table[i] = new object[5 + sitesDB.Count()];
				table[i][j++] = item.cvault;
				table[i][j++] = item.evpt;
				table[i][j++] = item.desc;
				table[i][j++] = item.duration;
				table[i][j++] = item.time;
				foreach (var site in sitesDB)
				{
					table[i][j] = false;

					foreach (var conf in configs)
					{
						if (Compare(site.SiteId, conf.site) && Compare(conf.baseF, item.Id))
						{
							table[i][j] = true;
							break;
						}
					}
					j++;
				}
				i++;
			}
			foreach (var item in table)
			{
				CVaultDataSource.Rows.Add(item);
			}
		}
	}

	#endregion

	#region Add column sites

	/// <summary>
	/// Add columns in table according to the sites stored in DB
	/// </summary>
	/// <remarks>The action is used to create site column</remarks>
	private void AddColumnSites()
	{
		const string siteCol = "SITE_COL";
		
		var addNewSite = new Action<string>(site =>
		{
			var ultraGridBand = this.CVaultGrid.DisplayLayout.Bands[0];

			var gridDataColumn = new UltraDataColumn(site);
			gridDataColumn.DataType = typeof(bool);
			gridDataColumn.Tag = siteCol;
			gridDataColumn.DataType = typeof(bool);
			gridDataColumn.DefaultValue = false;
			
			this.CVaultDataSource.Band.Columns.AddRange(new object[] {
				gridDataColumn
			});
		});

		for (int i = this.CVaultDataSource.Band.Columns.Count-1; i >= 0 ; i--)
		{
			if (this.CVaultDataSource.Band.Columns[i].Tag == siteCol)
			{
				this.CVaultDataSource.Band.Columns.RemoveAt(i);
			}
		}

		var sitesDB = from sites in this.lSites
					  orderby sites.KEY
					  select  sites.KEY ;

		foreach (var item in sitesDB)
		{
			addNewSite(item);
		}
	}

	/// <summary>
	/// Supposed to retrieve the status of checkboxes but does not work
	/// </summary>
	/// <param name="b"></param>
	/// <param name="row"></param>
	/// <returns></returns>
	private Dictionary<string, bool> GetStatusForRow(UltraDataBand b,
											 UltraGridRow row)
	{
		
		Dictionary<string, bool> statusChecked = new Dictionary<string, bool>();
		foreach (UltraDataColumn col in b.Columns.Cast<UltraDataColumn>()
										 .Where(x => x.Tag != null &&
												x.Tag.ToString() == "SITE_COL"))
		{
			
			statusChecked.Add(col.Key, Convert.ToBoolean(row.Cells[col.Key].Value));

		}
		return statusChecked;
	}
	
	#endregion

	#endregion

	#region Form Events

	/// <summary>
	/// Form loading event
	/// </summary>
	/// <param name="sender">Form</param>
	/// <param name="e">Arguments (empty)</param>
	private void FrmCVault_Load(object sender, EventArgs e)
	{            
		this.retrieveData();
		this.AddColumnSites();
		this.LoadDataSource();
		CVaultGrid.DataBind();
	}

	private void ultraButton2_Click(object sender, EventArgs e)
	{
		CVaultGrid.ActiveRow.Update();
		CVaultGrid.DisplayLayout.Bands[0].AddNew();
	}

	private void FrmCVault_Shown(object sender, EventArgs e)
	{
		CVaultGrid.DisplayLayout.Bands[0].AddNew();
	}
	
	private void vl_ItemNotInList(object sender, ValidationErrorEventArgs e)
	{
		var ultrCombo = sender as UltraComboEditor;
		e.RetainFocus = true;

		if (e.LastValidValue != null)
			ultrCombo.Value = e.LastValidValue;
		else if (ultrCombo.Items.Count>0)
			ultrCombo.SelectedItem = ultrCombo.Items[0];
	}

	private void ultraGrid1_KeyDown(object sender, KeyEventArgs e)
	{
		if (e.KeyData == Keys.Enter)
		{
			CVaultGrid.UpdateData();
		}
	}

	private void Cancel_Click(object sender, EventArgs e)
	{
		this.Close();
	}

	private void SAVE_Click(object sender, System.EventArgs e)
	{
		this.GetStatusCheckboxes();
		this.GetStatusHours();
	}

	/// <summary>
	/// Get the status of checkboxes which have been changed (check or uncheck)
	/// </summary>
	private void GetStatusCheckboxes()
	{
		GetStatusForRow(CVaultDataSource.Band, CVaultGrid.ActiveRow);
		Dictionary<string, bool> statusChecked = GetStatusForRow(CVaultDataSource.Band, CVaultGrid.ActiveRow);
		foreach (KeyValuePair<string, bool> kvp in statusChecked)
			Console.WriteLine("Status site:" + kvp.Key + " is " + kvp.Value.ToString());
	}

	/// <summary>
	/// Get back the hour which have been updated
	/// From the column DURATION or ETD
	/// </summary>
	private void GetStatusHours()
	{
		
	}

	#endregion
}


Et voici un aperçu de l'IHM :



Le but étant de récupérer toutes les valeurs des checkboxes et de mettre à jour la BDD en conséquence.
Je ne m'y connais pas trop trop en C#, donc je ne sais pas ce qui serait le plus intéressant, regarder toutes les checkboxes lorsque on appuie sur "Save" ou bien avoir une sorte de Event Listenner sur les checkboxes pour ne transmettre que celles qui ont été modifié.
Dans un second temps je devrais également récupérer les champs de dates, mais ça je verrais un peu plus tard.
Donc j'utilise Infragistic 2015 et si vous avez besoin d'informations complémentaires demandez moi

Il se peut que je n'appelle pas là méthode là où il faut ou quelque chose du genre...

Merci !

2 réponses

Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024 656
1 oct. 2015 à 19:37
Bonjour le plus simple à coder, à mon sens, est d'écrire une classe qui corresponde à ta base de données.

Tu charges ta BDD dans une liste de cette classe et tu bindes cette liste à ton datagridview.

Ainsi dès qu'une modification est faite, la donnée dans la liste est modifiée.
Pas d'événement à gérer.

A la fin (click sur save par exemple), tu exportes la liste dans ta BDD.

Voir ici
http://codes-sources.commentcamarche.net/faq/1291-utilisation-du-binding-au-travers-de-l-objet-databindingsource
0
Majestick Messages postés 19 Date d'inscription jeudi 26 février 2015 Statut Membre Dernière intervention 2 octobre 2015
2 oct. 2015 à 09:13
Bonjour, merci pour ta réponse.

Cependant je ne sais pas si c'est très adapté à mon projet. Car pour communiquer avec la base de données je passe par des web services en Java. Donc je transmets des objets de Java vers C# ou l'inverse pour récupérer ou modifier les données dans la BDD.

J'ai regardé le lien que tu m'as transmis et effectivement, ça à l'air très intéressant mais il semblerait que ce soit adapté juste pour du C# qui communique directement avec la BDD non?

Sinon j'ai corrigé mon problème :

/// <summary>
        /// Get the status of checkboxes which have been changed (check or uncheck)
        /// </summary>
        private void GetStatusCheckboxes()
        {
            var statusChecked = new Dictionary<string, Dictionary<string, bool>>();
            foreach (UltraDataRow row in CVaultDataSource.Rows)
            {
                statusChecked.Add(row.GetCellValue(0).ToString(), GetStatusForRow(CVaultDataSource.Band, row));
            }

            foreach (KeyValuePair<string, Dictionary<string, bool>> kvp in statusChecked)
            {
                foreach (var sr in kvp.Value)
                {
                    Console.WriteLine(string.Format("[{0}] Status site: {1} is {2}", kvp.Key, sr.Key, sr.Value));    
                }
            }
                
            Console.WriteLine("\r\n");
        }
0
Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024 656
2 oct. 2015 à 09:50
Bonjour

Donc je transmets des objets de Java vers C# ou l'inverse pour récupérer ou modifier les données dans la BDD.

J'ai regardé le lien que tu m'as transmis et effectivement, ça à l'air très intéressant mais il semblerait que ce soit adapté juste pour du C# qui communique directement avec la BDD non?


non je ne pense pas si tu envoie ou reçois tes objets de java, une fois dans C# t'en fais ce que tu veux.


Si ta question est résolue, merci de marquer la discussion comme telle avec le lien, tout en haut juste sous le titre de la discussion
0
Rejoignez-nous