web-dev-qa-db-fra.com

DropDownList a une SelectedValue qui n'est pas valide car elle n'existe pas dans la liste des éléments. Nom du paramètre: valeur

Je continue à avoir l'erreur ci-dessus dans la ligne de titre et cela n'a aucun sens, car j'utilise un exemple de table avec seulement 5 enregistrements et chaque enregistrement a une valeur selon le menu déroulant. 

Ceci est mon code utilisé pour déclarer la liste déroulante. J'ai joint deux tables dans ma source de données SQL pour refléter ce que je veux remplir dans la vue de grille et j'ai des colonnes cachées si nécessaire. J'utilise la même source de données pour remplir la liste déroulante. Toute aide serait la bienvenue.

<asp:DropDownList ID="DropDownListCurrency" runat="server" 
                  CausesValidation="True" DataSourceID="GridView" 
                  DataTextField="Currency" DataValueField="Currency_ID" 
                  AppendDataBoundItems="True"> 

          <asp:ListItem Value="0" Text="&lt;Select&gt;" Enabled="True"></asp:ListItem>
</asp:DropDownList>

enter image description here

protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
{
    try 
    {
        GridViewRow row = GridView1.SelectedRow; 

        AccountNumber.Text = (string)row.Cells[0].Text;
        ....

        DropDownListCurrency.SelectedValue = (string)row.Cells[8].Text;
    }
    catch (Exception ex)
    {
        Console.WriteLine("{0} Exception caught.", ex);
    }        
}
8
New2This

Essayez de trouver la valeur dans la liste déroulante avant d'essayer de définir SelectedValue, comme ceci:

if (DropDownListCurrency.Items.FindByValue(row.Cells[8].Text.ToString().Trim()) != null)
{
    DropDownListCurrency.SelectedValue = row.Cells[8].Text.ToString().Trim();
}

Remarque: L'appel Trim() supprime les espaces de début ou de fin dans le texte de votre zone de texte, ce qui peut entraîner la non-correspondance d'une correspondance.

Donc, votre code complet devrait être ceci:

protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
{
    try 
    {
        GridViewRow row = GridView1.SelectedRow; 

        AccountNumber.Text = (string)row.Cells[0].Text;
         ....

        if (DropDownListCurrency.Items.FindByValue(row.Cells[8].Text.ToString().Trim()) != null)
        {
            DropDownListCurrency.SelectedValue = row.Cells[8].Text.ToString().Trim();
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine("{0} Exception caught.", ex);
    }
}
11
Karl Anderson

c'est si simple, utilisez ceci 

Dropdown.SelectedValue = null;
Dropdown.DataBind();
3
coder

Bonjour, peut-être que dans cette cellule de votre gridview, il y a un blanc ou une liste déroulante, par exemple, ce n'est pas la même chose

Dolar__ = Dolar

ou

Dolar = Dolar__

utilisez un ajustement dans le code derrière pour effacer les espaces dans SQL Server n'utilisez pas Rtrim, ce n'est pas une bonne pratique

2
Ryuzaki

Les valeurs de la liste déroulante sont différentes des valeurs de la colonne de la base de données.

Exemple: Le menu déroulant montre Emma, ​​mais dans la base de données, il existe Emma et Emma1.

La liste déroulante ne peut pas trouver la valeur Emma1.

1
FabioA

La définition de la propriété Text de DropDownList dans ASPX avec la valeur manquante dans ItemList provoque la même erreur.

Dans mon cas, ce qui s'est passé, c'est que j'ai ajouté par erreur une balise meta-resourcekey où la propriété Text a été définie avec la valeur manquante dans ItemList.

Les valeurs de ressources étaient:

table {
  border-collapse: collapse;
  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
}
table th, table td {
  border: solid 1px darkgray;
  padding: 0 5px;
}

table.tr:first(){
  
}
<table css="table">
  <tr>
    <th>Name</th>
    <th>Value</th>
    <th>Comment</th>
  </tr>
  <tr>
    <td>Template.Text</td>
    <td>Template</td>
    <td></td>
  </tr>
  <tr>
    <td>Template.ToolTip</td>
    <td>template of standard outgoing email settings</td>
    <td></td>
  </tr>
</table>

et le contrôle ASPX était:

        <asp:DropDownList runat="server" ID="ddlTemplate" CssClass="form-control dropdownlist" meta:resourcekey="Template" >
            <asp:ListItem Selected="True" meta:resourcekey="TemplateEmpty" Value="EMPTY" />
            <asp:ListItem Selected="False" meta:resourcekey="TemplatePOP3" Value="POP3" />
            <asp:ListItem Selected="False" meta:resourcekey="TemplatePOP3Secured" Value="POP3S" />
            <asp:ListItem Selected="False" meta:resourcekey="TemplateIMAP" Value="IMAP" />
            <asp:ListItem Selected="False" meta:resourcekey="TemplateIMAPSecured" Value="IMAPS" />
        </asp:DropDownList>

Enlever le meta:resourcekey a fait l'affaire pour moi.

0
Michal Šuvada

Cela peut se produire si les lignes de la liste déroulante se trouvent dans une table liée et que l'intégrité référentielle n'est pas utilisée dans la base de données. Dans mon cas, j'utilise l'intégrité référentielle, mais j'ajoute un booléen à l'enregistrement de la liste déroulante pour indiquer "Désactivé", c'est-à-dire que je ne souhaite plus que les utilisateurs puissent sélectionner cette valeur dans la liste déroulante. Je filtre donc la liste déroulante pour afficher uniquement les valeurs qui ne sont pas "désactivées", mais le problème est que les données existantes peuvent déjà contenir la valeur, ce qui entraîne le message d'erreur ci-dessus lorsque vous appuyez sur Modifier sur la grille.

La façon dont je gère cette situation est la suivante:

  1. Faites la liste déroulante en question non liée pour éviter l'erreur.
  2. Ajoutez le code suivant dans le code derrière:

    protected void StaffTypeGridView_OnRowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType != DataControlRowType.DataRow ||
            e.Row.RowIndex != StaffTypeGridView.EditIndex) return;
    
        var staffType = (StaffType)e.Row.DataItem;
        var appCode = staffType.AppCode;
    
        var ddl = (DropDownList) e.Row.FindControl(ddlName);
        if (!string.IsNullOrEmpty(value) &&
            ddl.Items.FindByValue(value) == null)
        {
            ddl.Items.Add(new ListItem
            {
                Value = value,
                Text = value + " (Deleted)"
            });
        }
        ddl.SelectedValue = value;
    }
    
  3. N'oubliez pas d'écrire du code dans DropDownList_OnSelectedIndexChanged ou dans GridViewOnRowUpdating pour mettre à jour la valeur dans la source de données (en tant que champ indépendant).

  4. Ajoutez un validateur personnalisé à EditItemTemplate pour vous assurer que les données supprimées ne peuvent pas être entrées, c’est-à-dire que l’utilisateur DOIT changer la valeur dans la liste déroulante pour pouvoir être sauvegardé.

Cela semble assez compliqué à expliquer, mais constitue un moyen assez simple de fournir cette fonctionnalité, à moins que quelqu'un n'ait de meilleures idées ...

0
Philip Johnson

Vous pouvez utiliser la méthode Trim ()

ddlname.Text = dt.Rows[0][3].ToString().Trim();
0
Veeramuthu