Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C#] DataGridView Cellen (in)visible & editable maken?

Pagina: 1
Acties:

  • F-Tim
  • Registratie: November 2003
  • Laatst online: 15-11 13:20
Hi allemaal, misschien is de oplossing voor mijn probleem heel erg simpel, maar ik kom maar zelf niet tot een oplossing. Heb wel al een idee, maar ik vermoed dat ik me daar onnodig veel werk mee op de hals haal.

Situatie is als volgt; ik heb een DataGridView, Hierin zijn een X aantal kolommen aangemaakt. Sommigen komen regelrecht uit de database, en anderen zijn Checkbox velden welke niet aan de DB gekoppeld zijn. Het koppelen van de DataSet aan de GridView vult ook alleen de velden die gekoppeld zijn (logisch :9 )... en so far so good. De GridView heeft overigens Adding, Editing, Deleting en Column Reordering op false staan.

Hier begint ook echter mijn probleem. Na het vullen was mijn 1ste gedachte om middels een foreach loop door elke Row in de GridView te lopen, en afhankelijk van de waarden die ik uit de cellen A, B en C lees de Checkbox cellen visible op true of false te zetten. Dit mag van VS al niet want het zijn alleen maar read-only velden. 2de probleem waar ik dán tegenop loop is, omdat de control niet editable is mogen gebruikers geen gegevens in de datagridview editen, zodoende kunnen de Checkbox velden ook niet gewijzigd worden. Als ik echter de hele control op Editable zet, dan mogen ook de velden uit de database gewijzigd worden, iets wat ik dus wil voorkomen.... en zoals gezegd, per cell de EditType wijzigen mag niet omdat deze ReadOnly is. (Bovendien krijg ik dan een compiler error die aangeeft dat de typen niet overeen komen, maar dit is nog wel op te losse met typecasten)

Om toch even kort wat code te laten zien heb ik het volgende (uiteraarde een ingekorte & versimpelde variant):

C#:
1
2
3
4
5
6
7
8
9
10
11
foreach (DataGridViewRow datarow in gvPersData.Rows)
{
    if (datarow.Cells["A"].Value == "X" && datarow.Cells["B"].Value == "Y")
        // de Checkbox cell Editable maken, maar dit is een ReadOnly property
        datarow.Cells["colChkAllowUser"].EditType = DataGridViewEditMode.EditOnEnter;
    else
        // Aangezien de cellen standaard visible zijn hoef ik ze alleen
        // maar op visible = false te zetten maar omdat het een
        // ReadOnly property is mag dit dus ook niet.
        datarow.Cells["colChkAllowUser"].Visible = false;
}


Mijn vraag is, is er een optie om dit wel te doen? Of zal ik aan de slag moeten gaan om een Custom DataGridView te maken? Ik ga iig nu eens kijken of ik de EditType en Visible property kan overriden, maar makkelijk zal dat niet worden lijkt me zo... 8)7 Dus als iemand iets weet waarmee ik aan de slag kan zou ik hem (of haar ;) ) zeer dankbaar zijn!

Google leert me voorlopig alleen maar dát de velden ReadOnly zijn, en helemaal niets over een eventuele edit optie.... zoek ik nou niet goed? Of is het gewoon niet mogelijk met de DataGridView?

Edit: Hier, hier en hier is te zien dat gebruiker TR ook al geen oplossing voor het Edit probleem kan vinden.

[ Voor 11% gewijzigd door F-Tim op 11-02-2008 09:56 . Reden: Aantal URL's toevoegen. ]

Wanna play?


Verwijderd

http://msdn2.microsoft.co...agridviewrow_members.aspx

datarow["Naam"].Visible = false;
datarow["Naam"].ReadOnly = false;

deze zijn ook beschikbaar vanuit het de columns collection van het datagridview object zelf.

Ik denk niet dat je dit kan veranderen op een per cell basis. Ik denk ook niet dat het wenselijk is aangezien het erg onduidelijk voor de gebruiker kan zijn waarom hij / zij wel een waarde in de colom kan veranderen maar een andere niet. Zet de gegevens die de gebruiker mag veranderen in een andere colom dan de gegevens die niet veranderd mogen worden.

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Dat per cel Editable maken kan natuurlijk prima in de events (CellBeginEdit). Dat per cel visible maken snap ik niet helemaal, want waarom zou je zo'n rij dan wel weergeven? Het lijkt me handiger om in CellFormatting de opmaak iets aan te passen.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • F-Tim
  • Registratie: November 2003
  • Laatst online: 15-11 13:20
pedorus schreef op maandag 11 februari 2008 @ 16:14:
Dat per cel Editable maken kan natuurlijk prima in de events (CellBeginEdit). Dat per cel visible maken snap ik niet helemaal, want waarom zou je zo'n rij dan wel weergeven? Het lijkt me handiger om in CellFormatting de opmaak iets aan te passen.
CellBeginEdit is idd een goeie! Afhankelijk van de gelezen waardes kan ik dan de Edit idd beeindigen of juist laten bestaan (bv, afhankelijk van de kolom-naam en de status van de cell). Dat lost iig al een probleem op! Heb middels kleurgebruik het al doen lijken alsof bepaalde kolommen niet wijzigbaar zijn, maar dit is uiteraard pure schijn aangezien ze het wel degelijk echt zijn.

Het per cel visible maken zal ik wel even verduidelijk aan de hand van de volgende tabel:
Puk, Pietje01-01-1981O Apply
Adres PriveTel PriveEmail Prive
Adres WerkTel WerkEmail Werk
Thomasson, Tom02-02-1982O Apply
Adres PriveTel PriveEmail Prive
Adres WerkTel WerkEmail Werk


Stel "O Apply" even voor als een checkbox.

Je hebt dus per contactpersoon een header-regel en een data-regel. Afhankelijk van de actie wil je dus óf een complete contactpersoon, óf slechts 1 gegevensregel van een contactpersoon beinvloeden. Bij het toekennen van contactpersonen aan de groep "Familie" of "Collega's", wil ik dus dat de Checkboxen op de header-regels van de contactpersonen staan. (Immers, waarom zou je alleen zijn werk-adres toekennen aan de groep familie? De extra checkboxen op deze regels zorgen m.i. alleen maar voor verwarring). Anderszijds, als je een email wil rondsturen naar contactpersonen moet je kunnen aangeven of het bv naar de werk-email gaat of naar de prive email, of misschien zelfs beide. In dat geval wil ik de checkboxxen alleen maar op de gegevens regels tonen. (Waarom zou je immers een header regel kunnen selecteren als daar geen Email adres instaat?). Aangezien de hele kolom een checkbox-kolom is wil ik dus per regel (per checkbox-cell) kunnen bepalen of je daar de checkbox in mag zien ja of nee. Omdat dit afhankelijk is van de actie die je doet... ik hoop het zo een beetje duidelijker gemaakt te hebben en ook aangetoond te hebben waarom ik het dus juist wél per regel editable en invisible wil maken :> (ps. in ASP kan het wel op deze manier en is het toch ook overzichtelijk voor gebruikers? Waarom zou het dan niet in C# overzichtelijk kunnen zijn? :+ )

@JMfx: Je ziet nu dus ook waarom het visible/invisible maken van een complete datarow in dit geval dus niet wenselijk is. Idem voor read-only, als nl. de hele row read-only is kun je ook niet op de checkbox klikken... een complete datarow invisible maken kan wel handig zijn als je wilt switchen tussen beknopt/gedetailleerd overzicht, maar dan zit ik verder alsnog met de specifieke cellen per regel...

Wanna play?


  • pedorus
  • Registratie: Januari 2008
  • Niet online
Een mogelijk oplossing van dit probleem is natuurlijk niet zo moeilijk (in CellPainting e.PaintBackground(e.CellBounds,true); e.Handled = true; doen en de box niet laten tekenen).

Mijn vraag is eigenlijk of er een betere control is dan DataGridView is voor dit soort situaties, waarbij je een record eigenlijk op meerdere regels wil tonen vanwege de ruimte. Andersom heb je ook zo'n probleem, als je records van zeg 2 variabelen en een soort lijst-modus wil tonen. Dus een soort combinatie tussen ListView en DataGridView.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten