Avatar billede testing Nybegynder
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?
Avatar billede sirerugor Nybegynder
02. november 2008 - 18:41 #1
Du kan bruge DISTINCT i din SELECT query. Så vil der ikke være dubletter.. :)
Avatar billede testing Nybegynder
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.
Avatar billede testing Nybegynder
03. november 2008 - 11:29 #3
Samt at datagridviewet har en bindsouce som datasouce.

bindingsourcens datasource er et object som har en Add funktion.
Avatar billede sirerugor Nybegynder
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?
Avatar billede testing Nybegynder
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.
Avatar billede sirerugor Nybegynder
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.
Avatar billede testing Nybegynder
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.
Avatar billede sirerugor Nybegynder
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.
Avatar billede testing Nybegynder
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.
Avatar billede sirerugor Nybegynder
03. november 2008 - 12:35 #10
Det der fungerer ikke..
foreach(Class2 Item in Items)
{
  MessageBox.Show(Item.Name);
}

Det der gør.
Avatar billede testing Nybegynder
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.
Avatar billede sirerugor Nybegynder
03. november 2008 - 12:54 #12
foreach(Class2 n in Item.ReturnList())
  MessageBox.Show(n.name);

Ville virke.
Avatar billede testing Nybegynder
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....
Avatar billede sirerugor Nybegynder
03. november 2008 - 13:01 #14
Breaker? Har du sat et break-point da?
Avatar billede testing Nybegynder
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.
Avatar billede sirerugor Nybegynder
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...
Avatar billede testing Nybegynder
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; }
    }
}
Avatar billede sirerugor Nybegynder
03. november 2008 - 13:35 #18
Lige før og lige efter linjen: List.Add(item);
Prøv da at skrive listen ud..
Avatar billede testing Nybegynder
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.
Avatar billede sirerugor Nybegynder
03. november 2008 - 13:58 #20
Jamen det er da også logisk. Du kalder aldrig metoden Add nogensteder.
Avatar billede testing Nybegynder
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?
Avatar billede sirerugor Nybegynder
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.
Avatar billede testing Nybegynder
03. november 2008 - 14:23 #23
Ok.. Har du nolge ideer til hvordan og hvorledesdette gøres..??
Avatar billede sirerugor Nybegynder
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?
Avatar billede testing Nybegynder
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");
            }
Avatar billede testing Nybegynder
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
Avatar billede testing Nybegynder
03. november 2008 - 15:39 #27
Fik løst problemet.
Avatar billede sirerugor Nybegynder
03. november 2008 - 15:49 #28
Tak for point. :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester