Comment déplacer par le code de la BindingSource à un enregistrement spécifique
À l'aide de datagridview lié à BindingSource contrôle lié à un LINQ SQL classe, je me demande comment la position de la bindingSource à un enregistrement spécifique, qui est, lorsque je tape un nom de Produit dans une zone de texte, le bindingsource doit se déplacer pour que le produit en question. Voici mon code:
Dans mon formulaire FrmFind:
NorthwindDataContext dc;
private void FrmFind_Load(object sender, EventArgs e)
{
dc = new NorthwindDataContext();
var qry = (from p in dc.Products
select p).ToList();
FindAbleBindingList<Product> list = new FindAbleBindingList<Product>(qry);
productBindingSource.DataSource = list.OrderBy(o => o.ProductName);
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
TextBox tb = sender as TextBox;
int index = productBindingSource.Find("ProductName", tb.Text);
if (index >= 0)
{
productBindingSource.Position = index;
}
}
Dans le programme de la classe:
public class FindAbleBindingList<T> : BindingList<T>
{
public FindAbleBindingList()
: base()
{
}
public FindAbleBindingList(List<T> list)
: base(list)
{
}
protected override int FindCore(PropertyDescriptor property, object key)
{
for (int i = 0; i < Count; i++)
{
T item = this[i];
//if (property.GetValue(item).Equals(key))
if (property.GetValue(item).ToString().StartsWith(key.ToString()))
{
return i;
}
}
return -1; //Not found
}
}
Comment puis-je mettre en œuvre la méthode find pour le faire fonctionner?
Définir la propriété Position. msdn.microsoft.com/en-us/library/...
J'ai déjà vérifié le lien, il n'a pas répondu à ma question.
Peut-être que ce sera plus utile msdn.microsoft.com/en-us/library/ms158165.aspx
Également vérifié avant, ce jeu de données qui n'est pas mon type de source de données.
J'ai déjà vérifié le lien, il n'a pas répondu à ma question.
Peut-être que ce sera plus utile msdn.microsoft.com/en-us/library/ms158165.aspx
Également vérifié avant, ce jeu de données qui n'est pas mon type de source de données.
OriginalL'auteur Sami-L | 2012-07-30
Vous devez vous connecter pour publier un commentaire.
Vous pouvez combiner les
BindingSource.Find()
méthode avec lePosition
propriété.Par exemple, si vous avez quelque chose comme ceci dans votre zone de texte a changé de gestionnaire d'événement:
Bien sûr, cela dépendra de beaucoup de choses comme la mise en oeuvre particulière de la méthode de recherche de la source de données pour la liaison de source.
À une question que vous avez posée tout à l'heure, je vous ai donné une mise en œuvre pour Trouver qui a travaillé avec des matchs complets. Ci-dessous est légèrement différente de la mise en œuvre qui sera au départ de la propriété de l'inspection:
Ne remarque que la méthode ci-dessus est sensible à la casse, vous pouvez changer de StartsWith à être sensible à la casse si vous avez besoin d'.
Un truc important à noter à propos de la manière .Net fonctionne, c'est que le type réel d'un objet ne suffit pas tout le temps - le type déclaré est ce qui consomme le code en sait quelque chose.
C'est la raison pourquoi vous obtenez une
NotSupported
exception lors de l'appel de la méthode Find, même si votreBindingList
la mise en œuvre a une méthode Find - le code qui reçoit cette liste liaison ne sais pas à propos de le Trouver.La raison en est que dans ces lignes de code:
Lorsque vous définissez la source de données de la source de liaison-vous d'inclure la méthode d'extension
OrderBy
- la Vérification de cette montre qu'il renvoie IOrderedEnumerable, et l'interface décrite ici sur MSDN. Notez que cette interface n'a pas de méthode de recherche, de sorte que même si le sous-jacentFindableBindingList<T>
prend en charge de Trouver la source de liaison ne sais pas à ce sujet.Il y a plusieurs solutions (le mieux est à mon avis pour étendre votre FindableBindingList également en charge le tri et le tri de la liste), mais le moyen le plus rapide pour votre code actuel est de trier plus tôt comme suit:
En WinForms il n'y a pas tout à fait hors de la boîte de solutions pour les choses que vous essayez de faire - ils ont tous besoin d'un peu de code personnalisé que vous avez besoin de mettre ensemble pour correspondre à vos propres exigences.
1.FindCore(PropertyDescriptor prop, Object key) at System.ComponentModel.BindingList
1.Système.ComponentModel.IBindingList.Trouver(PropertyDescriptor prop, clé d'Objet), toute pensée s'il vous plaît?Ainsi, vous obtenez la même exception - vous n'avez pas mis en œuvre la méthode find. À ce stade, il est très difficile de vous aider, vous semblez être en train de faire beaucoup de choses que vous ne nous dites pas alors à poser des questions qui ne sont pas vraiment liées à l'erreur que vous obtenez. Ce que vous avez une bindinglist qui prend en charge la trouver, alors vous pouvez trouver et indexer et de définir la position à partir de cet indice.
Je vais revoir ma mise en œuvre de BindingList. David, peut-être comme vous l'avez dit il y a quelque chose que je n'ai pas mentionné ici que fait cette erreur apparaît. La première fois que j'ai posté une question sur la méthode de filtrage, et la deuxième fois j'ai posté une question sur la méthode de recherche, je ne vois aucun mal à cela. Et je ne cache pas ma joie de vous retrouver dans ce fil, car grâce à vous j'ai appris des choses intéressantes. Que vous êtes sûr de ce que vous avez dit, puis-je vous demander, s'il vous plaît être patient pendant un moment. De mon côté, je suis sûr qu'avec votre aide, nous pouvons clarifier cette question.
Si vous avez toujours des problèmes d'obtention de ce tous les de travailler peut-être qu'il serait mieux d'aller en discuter? Si vous lisez ceci dans le prochain court alors que je serai sur le chat (cliquez sur le lien en haut de cette page) dans le c# chambre.
Désolé je suis venu ici 1 heure après avoir quitté le chat, j'ai ajouté le code utilisé pour la question initiale, de sorte s'il vous plaît comment mettre en œuvre la méthode find. Par la façon avez-vous une idée sur la BindingListView. il nous semble intéressant aussi.
OriginalL'auteur David Hall
J'ai pris une approche différente. J'ai pensé que, par programme, chaque enregistrement doit être vérifié jusqu'à ce qu'une correspondance est trouvée, alors j'ai juste itération en utilisant la méthode MoveNext jusqu'à ce que j'ai trouvé une correspondance. Pas sûr que la position de départ serait le Premier enregistrement ou pas, j'ai donc utilisé la méthode MoveFirst pour s'assurer que c'était.
Il y a une hypothèse, et qu'est-ce que vous cherchez est unique dans cette colonne. Dans mon cas, j'ai été à la recherche pour correspondre à une Identité entier.
OriginalL'auteur Scooter