Avatar billede mosquito Nybegynder
16. marts 2006 - 13:57 Der er 3 kommentarer og
1 løsning

Add DataRow til DataTable - Value is already present

I en tabel har jeg nogle kunder, hvor jeg vil tilføje en ny række til. Selvom rækken ikke findes i tabellen, sker det med mellemrum at jeg får en exception - Value 'xxx' is already present.

tabellen er databound til en dropdownlist - ddlCustomers.

Hvordan sikrer jeg mig at tabellen kun opdateres når den ikke findes i tabellen i forvejen? Jeg har prøvet nedenstående, men omkring halvdelen af gangene, får jeg af vide at den allerede eksisterer.

Ved at databinde til en gridview, kan jeg se at det tilføjes ok, men det er ikke i min dropdown.... mystisk

skulle mene at afviklingen sker sekventielt linie for linie.. .eller ???

her er min kode:
// a table from previous selections on other page
DataTable foundCustomers = (DataTable) Session["found customers"];

// recent customers from database
DataTable recentCustomers = (DataTable) db.GetRecentCustomers(userID);

// add recent customers to session variable
Session["recent customers"] = recentCustomers;

// create row based on recent customers table
DataRow customer = recentCustomers.NewRow();

// get selected item from another table
string id = foundCustomers.Rows[gvCustomers.SelectedIndex][0].ToString();
               
// set 'ID' for the row to add
customer["ID"] = id;

// set 'customer' for the row to add
customer["customer"] = foundCustomers.Rows[gvCustomers.SelectedIndex][2].ToString();

// is the id already in the 'recent orders' table??
bool found = recentcustomers.rows.contains(id);

// if not in 'recent orders' table - add it
if (!found)
{
  recentCustomers.Rows.Add(customer);
  ddlCustomers.Items.Clear();
  ddlCustomers.DataSource = recentCustomers;
  ddlCustomers.DataTextField = "customer";
  ddlCustomers.DataValueField = "ID";
  ddlCustomers.DataBind();

  // select the added item
  ddlCustomers.Items.FindByValue(id).Selected = true;
}
else
{
  lblFoundCustomerInfo.Text = "Order is already in list";
  ddlCustomers.DataBind();
}

// test gridview viser tabellen 'recent customers'
gvTest.Datasource = recentCustomers;
gvTest.DataBind();
Avatar billede dr_chaos Nybegynder
16. marts 2006 - 14:22 #1
hvad er der specielt ved tilfældene hvor den allerede findes ?
Avatar billede mosquito Nybegynder
16. marts 2006 - 14:34 #2
tænkt eksempel:
'recentCustomers' indeholder 1, 2, 3 (primærnøgler)..
fra en anden tabel 'foundCustomers', har jeg en ny row med 'id' 100,

den bliver fint indsat i tabellen og vises fint i mit gridview 'gvTest', men ikke altid i  dropdownlisten 'ddlCustomers'. Når den ikke vises i 'ddlCustomers', får jeg en exception - value 'D' is already present

Ideen er at jeg har en kundeliste med top 10 anvendte kunder, men skal jeg bruge en anden end dem der allerede er i listen, skal jeg tilføje en ny kunde fra mit kartotek af alle mine kunder. Er kunden i top 10 har jeg ikke brug for at tilføje. Men ved tilføjelser sker der altså fejl ind imellem (50/50)
Avatar billede mosquito Nybegynder
16. marts 2006 - 14:35 #3
ups.. ret value 'D' til value '100'
Avatar billede mosquito Nybegynder
16. marts 2006 - 16:19 #4
Så fandt jeg løsningen. Problemet så ud til at ligge i session variablerne.

her er snippet af min løsning:

if (!Page.IsPostBack)
{
    Session["recent customers"] = null;

    DataTable recentCustomers;
    if (Session["recent customers"] == null)
    {
      recentCustomers = db.GetRecentCustomers(userID);
      Session["recent customers"] = recentCustomers;
    }

    recentCustomers = (DataTable) Session["recent customers"];

    DataColumn[] keys = new DataColumn[1];
    keys[0] = recentCustomers.Columns["ID"];
    recentCustomers.PrimaryKey = keys;

    ddlCustomers.Items.Clear();
    ddlCustomers.DataSource = recentCustomers ;
    ddlCustomers.DataTextField = "customer";
    ddlCustomers.DataValueField = "ID";
    ddlCustomers.DataBind();
}

// gvCustomers is bound to table of found customers based on search criteria
protected void gvCustomers_SelectedIndexChanged(object sender, EventArgs e)
{
    DataTable foundCustomers = (DataTable) Session["found customers"];
    DataTable recentCustomers = (DataTable) Session["recent customers"];
    DataRow customer = recentCustomers.NewRow();

    string id = foundCustomers.Rows[gvCustomers.SelectedIndex][0].ToString();
    customer["ID"] = id;
    customer["customer"] = foundCustomers.Rows[gvCustomers.SelectedIndex][2].ToString();

    if (!recentCustomers.Rows.Contains(id))
    {
        recentCustomers.Rows.InsertAt(customer, 0);
    }
    ddlCustomers.Items.Clear();
    ddlCustomers.DataSource = recentCustomers;
    ddlCustomers.DataTextField = "customer";
    ddlCustomers.DataValueField = "ID";
    ddlCustomers.DataBind();

    ddlCustomers.SelectedIndex = 0;
}
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
Kurser inden for grundlæggende programmering

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