01. november 2008 - 20:43
Der er
26 kommentarer og 2 løsninger
Dublicate values i datagridview
Hey Eksperter. Findes der en måde så man kan undgå at der kommer dublicate values i ens datagridview?
Annonceindlæg fra GlobalConnect
02. november 2008 - 18:41
#1
Du kan bruge DISTINCT i din SELECT query. Så vil der ikke være dubletter.. :)
03. november 2008 - 10:54
#2
Det skal lige siges at det er brugeren der ikke må kunne indtaste samme value i 2 forskellige celler.
03. november 2008 - 11:29
#3
Samt at datagridviewet har en bindsouce som datasouce. bindingsourcens datasource er et object som har en Add funktion.
03. november 2008 - 11:35
#4
Du skal blot tjekke om værdien allerede er blevet indtastet eller allerede eksiterer.. Hvis den gør giver du en alert. Må jeg evt. se noget af din source så jeg kan give et mere specifict svar?
03. november 2008 - 11:53
#5
f.eks Class1 : namespace WindowsFormsApplication1 { private List<Class2> Items = new List<Class2>(); class Class1 { Public void Add(string Name) { Class2 Item = new Class2(); Item.Name = Name; Items.Add(Item); } public List<Class2> ReturnList() { return Items: } } } Class2: namespace WindowsFormsApplication1 { Class Class2 { Public string Name {get;set;} } } Form1: Class1 Item = new Class1(); OnLoad: BindingSouce Source = new BindingSource; Source.DataSource = Item.ReturnList; Source.AllowNew = true; DataGridView1.DataSource = Source; Skal du bruge mere siger du bare til.
03. november 2008 - 12:09
#6
Hvis du nu lavede det om til at bruge en ArrayList i stedet og blot tjekkede om objektet allerede eksisterer så er det meget nemmere: ArrayList<Class2> Items = new ArrayList<Class2>(); ... Public void Add(string Name) { Class2 Item = new Class2(); Item.Name = Name; if(!Items.contains(Item)) Items.Add(Item); else { // fejl: eksisterer allerede.. } } Håber det kan hjælpe.
03. november 2008 - 12:17
#7
Jeg synes jeg har prøvet det du beskriver. Men Add funktionen bliver ikke kaldt når jeg indtaster nyt navn i mit DataGridview.
03. november 2008 - 12:25
#8
Du skriver: Source.DataSource = Item.ReturnList; Men ReturnList er jo en metode.. Prøv at skrive ud hvad der er i listen ved hvert Add kald. Hvis de ikke tilføjes vises de jo heller ikke.
03. november 2008 - 12:33
#9
Hvis jeg laver en knap: onClick: foreach(Class2 Items in Item) { MessageBox.Show(Items.Name); } Og jeg sætter break på i min Add i Class1. Så når jeg indtaster noget i mit datagridview vil den aldrig blive breaked, men npr jeg så trykker på knappen displayer den alligevel det jeg har indtastet i mit datagridview.
03. november 2008 - 12:35
#10
Det der fungerer ikke.. foreach(Class2 Item in Items) { MessageBox.Show(Item.Name); } Det der gør.
03. november 2008 - 12:50
#11
Form1: Class1 Item = new Class1(); altså må onClick være: foreach(Class2 n in Item) { MessageBox.Show(n.name); } Men det er heller ikke det der er problemet.
03. november 2008 - 12:54
#12
foreach(Class2 n in Item.ReturnList()) MessageBox.Show(n.name); Ville virke.
03. november 2008 - 12:59
#13
Ja, OK... :) Men det viser stadig det som jeg har indtastet i mit gridview uden at programmet breaker i Add funktionen....
03. november 2008 - 13:01
#14
Breaker? Har du sat et break-point da?
03. november 2008 - 13:04
#15
Ja.... Som jeg skrev tidligere ser det slet ikke ud til at den bliver kaldt, og derfor undre det mig at teskten alligevel er i listen når den bliver udskrevet.
03. november 2008 - 13:05
#16
Men den bliver addet siden det er det eneste sted du tilføjer noget. Korrekt? Ellers så post lige hele source...
03. november 2008 - 13:16
#17
namespace WindowsFormsApplication1 { public partial class Form1 : Form { Class1 test = new Class1(); BindingSource s = new BindingSource(); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { foreach (Class2 vb in test.returnList()) { MessageBox.Show(vb.Name); } } private void Form1_Load(object sender, EventArgs e) { s.DataSource = test.returnList(); dataGridView1.DataSource = s; s.AllowNew = true; dataGridView1.AutoGenerateColumns = true; } } class Class1 { List<Class2> List = new List<Class2>(); public void Add(string name) { foreach (Class2 v in List) { if (v.Name == name) { continue; } else { Class2 item = new Class2(); item.Name = name; List.Add(item); } } } public List<Class2> returnList() { return List; } } class Class2 { public string Name { get; set; } } }
03. november 2008 - 13:35
#18
Lige før og lige efter linjen: List.Add(item); Prøv da at skrive listen ud..
03. november 2008 - 13:53
#19
public void Add(string name) { foreach (Class2 v in List) { if (v.Name == name) { continue; } else { Class2 item = new Class2(); item.Name = name; foreach (Class2 b in List) { MessageBox.Show(b.Name); } List.Add(item); foreach (Class2 b in List) { MessageBox.Show(b.Name); } } } Igen jeg kommer slet ikke ind i funktionen.
03. november 2008 - 13:58
#20
Jamen det er da også logisk. Du kalder aldrig metoden Add nogensteder.
03. november 2008 - 14:01
#21
Og hvordan søger jeg for at det bliver kaldt? Og hvorfor er det så items i min liste når der bliver indtastet i mit datagridview?
03. november 2008 - 14:09
#22
Første spørgsmål: Siden informationen bliver indsat ved indtasning bør du nok lytte på et event om at gridview er blevet ændret, og der tjekke om det er lovligt.. Hvis det ikke er fjerner du det eller nægter det. Andet spørgsmål: Fordi når du indtaster i et felt fyres et event og den gemmer i listen. Denne liste er jo netop det Datasource du har sat på objektet.
03. november 2008 - 14:23
#23
Ok.. Har du nolge ideer til hvordan og hvorledesdette gøres..??
03. november 2008 - 14:44
#24
Du kunne jo bruge eventet: private void DataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e) { ... } Så kan du hvad der skal ændres eller tilføjes og se om det må stå der. :) Godt nok?
03. november 2008 - 15:04
#25
hmm... tror bare jeg giver fortabt... :( har prøvet at : i CellValueChanged men det virker ikke Class2 c = new Class2(); c.Name = dataGridView1.CurrentCell.Value.ToString(); if (test.returnList().Contains(c)) { MessageBox.Show("FEJL"); }
03. november 2008 - 15:11
#26
Class2 c = new Class2(); c.Name = dataGridView1.CurrentCell.Value.ToString(); foreach (Class2 v in test.returnList()) { if (v.Name == c.Name) { MessageBox.Show("Fejl"); } } Melder fejl hver gang på CellValueChanged event
03. november 2008 - 15:39
#27
Fik løst problemet.
03. november 2008 - 15:49
#28
Tak for point. :)
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.