La liaison de données ne peut pas trouver une ligne dans la liste qui est approprié pour toutes les liaisons à l'aide d'un bouton radio du Groupe avec plus de 9 dans le groupe

StackOverflow https://stackoverflow.com//questions/23051112

  •  21-12-2019
  •  | 
  •  

Question

Je suis l'aide de la technique décrite ici pour ajouter des Groupes de mes boutons radio pour mon C#, winforms application.

La technique fonctionne à merveille jusqu'à ce que j'essaie un bouton radio avec une étiquette de plus de 9.

Dans ce cas, une erreur se produit lorsque je clique sur le bouton radio

Système.InvalidOperationException est non gérée HResult=-2146233079
Message=liaison de données ne peut pas trouver une ligne dans la liste qui est approprié pour toutes les liaisons.Source=Système StackTrace:au Système.ComponentModel.ReflectPropertyDescriptor.SetValue(Objet composant, la valeur de l'Objet) au Système.De Windows.Les formulaires.BindToObject.SetValue(la valeur de l'Objet) au Système.De Windows.Les formulaires.De liaison.PullData(Boolean reformater, Boolean force) au Système.De Windows.Les formulaires.De liaison.Target_PropertyChanged(Object sender, EventArgs e) au Système.Gestionnaire d'événements.Invoke(Object sender, EventArgs e) au SMD.VivSnap.L'INTERFACE utilisateur.RadioGroupBox.radioButton_CheckedChanged(Object sender, EventArgs e) dans e:\EShared\devnet10\VivSnap\SnapInUI adioGroupBox.cs:ligne 70 au Système.Gestionnaire d'événements.Invoke(Object sender, EventArgs e) au Système.De Windows.Les formulaires.RadioButton.OnClick(EventArgs e) au Système.De Windows.Les formulaires.RadioButton.OnMouseUp(MouseEventArgs mevent) au Système.De Windows.Les formulaires.De contrôle.WmMouseUp(Message& m, MouseButtons bouton, Int32 clics) au Système.De Windows.Les formulaires.De contrôle.WndProc(Message& m) au Système.De Windows.Les formulaires.ButtonBase.WndProc(Message& m) au Système.De Windows.Les formulaires.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) au Système.De Windows.Les formulaires.UnsafeNativeMethods.DispatchMessageW(MSG& msg) au System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 raison, Int32 pvLoopData) au Système.De Windows.Les formulaires.Application.ThreadContext.RunMessageLoopInner(Int32 raison, ApplicationContext contexte) au Système.De Windows.Les formulaires.Application.ThreadContext.RunMessageLoop(Int32 raison, ApplicationContext contexte) au Système.De Windows.Les formulaires.Forme.ShowDialog(IWin32Window propriétaire) au SMD.VivSnap.Principal.Form1.btnForm1Go_Click(Object sender, EventArgs e) dans e:\EShared\devnet10\VivSnap\Main\Form1.cs:line 36 au Système.De Windows.Les formulaires.Bouton.OnMouseUp(MouseEventArgs mevent) au Système.De Windows.Les formulaires.De contrôle.WmMouseUp(Message& m, MouseButtons bouton, Int32 clics) au Système.De Windows.Les formulaires.De contrôle.WndProc(Message& m) au Système.De Windows.Les formulaires.ButtonBase.WndProc(Message& m) au Système.De Windows.Les formulaires.Bouton.WndProc(Message& m) au Système.De Windows.Les formulaires.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) au Système.De Windows.Les formulaires.UnsafeNativeMethods.DispatchMessageW(MSG& msg) au System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 raison, Int32 pvLoopData) au Système.De Windows.Les formulaires.Application.ThreadContext.RunMessageLoopInner(Int32 raison, ApplicationContext contexte) au Système.De Windows.Les formulaires.Application.ThreadContext.RunMessageLoop(Int32 raison, ApplicationContext contexte) au SMD.VivSnap.Principal.Programme.Main() dans e:\EShared\devnet10\VivSnap\Main\Program.cs:line 18 au Système.Domaine d'application._nExecuteAssembly(RuntimeAssembly assemblée, String[] args) chez Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() au Système.Le filetage.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback rappel, état de l'Objet, Boolean preserveSyncCtx) au Système.Le filetage.ExecutionContext.Exécuter(ExecutionContext executionContext, ContextCallback rappel, état de l'Objet, Boolean preserveSyncCtx) au Système.Le filetage.ExecutionContext.Exécuter(ExecutionContext executionContext, ContextCallback rappel, état de l'Objet) au Système.Le filetage.ThreadHelper.ThreadStart() InnerException:

Mon code pour la liaison de la propriété est

groupBox.DataBindings.Add("Selected", dataSource, PrinterTypeNum, false, DataSourceUpdateMode.OnPropertyChanged);

Mon code de la propriété est

public int PrinterTypeNum  
{
    get
    {
        try
        {
            return (int)this.PrinterType;
        }
        catch (Exception)
        {
            return 0;
        }
    }
    set
    {
        try
        {
            this.PrinterType = (jtVivPrinterEnum)value;
            // the enum goes from 0 to 15
        }
        catch (Exception)
        {
            this.PrinterType = jtVivPrinterEnum.jtVivPrinterUnknown;
            throw;
        }
    }
}

public jtVivPrinterEnum PrinterType { get; set; }

**

[Mise à jour] je viens de découvrir que je ne reçois pas le message d'erreur si la propriété est juste comme suit.

public int PrinterTypeNum { get; set; }

Ma Radio du Groupe classe est comme suit //Meilleure façon de databind un groupe de composants radiobutton dans WinForms

public partial class RadioGroupBox : GroupBox
{
    public RadioGroupBox()
    {
        this.InitializeComponent();
    }

    public event EventHandler SelectedChanged = delegate { };
    int _selected;
    public int Selected
    {
        get
        {
            return this._selected;
        }
        set
        {
            int val = 0;
            var radioButton = this.Controls.OfType<RadioButton>()
            .FirstOrDefault(radio => radio.Tag != null
            && int.TryParse(radio.Tag.ToString(), out val) && val == value);

            if (radioButton != null)
            {
                try
                {
                    radioButton.Checked = true;
                    this._selected = val;
                }
                catch (Exception ex)
                {
                    Debug.Print(ex.ToString());
                    throw;
                }
            }
        }
    }

    protected override void OnControlAdded(ControlEventArgs e)
    {
        base.OnControlAdded(e);
        var radioButton = e.Control as RadioButton;
        if (radioButton != null)
            radioButton.CheckedChanged += this.radioButton_CheckedChanged;
    }

    void radioButton_CheckedChanged(object sender, EventArgs e)
    {
        var radio = (RadioButton)sender;
        int val = 0;
        if (radio.Checked && radio.Tag != null
        && int.TryParse(radio.Tag.ToString(), out val))
        {
            this._selected = val;
            this.SelectedChanged(this, new EventArgs());  // raises error when val=10
        }
    }
}
Était-ce utile?

La solution

J'ai eu cette erreur quand j'ai changé le .Visible valeur false à la propriété dans l'une des données de composants liés.

Le travail autour de est de Supprimer DataBindings sur les contrôles avant de changer leur .Visible propriété à false, alors l'ajout de la DataBindings en arrière quand les rendre à nouveau visibles.

Voici le code pour illustrer l'erreur et comment la contourner:

void SetupStuff()
{
    BindingSource myBindingSource = new BindingSource();
    // Retrieve my data into a DataTable and add it to the BindingSource
    DataTable myDataTable = GetMyDataTable(); 
    myBindingSource.DataSource = myDataTable.DefaultView;

    // Add DataBindings to Visible components only
    myTextBox.Visible = true;
    myTextBox.DataBindings.Add("Text", myBindingSource, "MySecret");
}

void UpdateStuff()
{
    // Update the currently selected data record
    myDataTable.DefaultView[myBindingSource.Position].BeginEdit();
    myDataTable.DefaultView[myBindingSource.Position]["MySecret"] = "Top Secret Meetup " + DateTime.Now.AddDays(1).ToString();
    myDataTable.DefaultView[myBindingSource.Position].EndEdit();
    myDataTable.DefaultView[myBindingSource.Position].AcceptChanges();
    // if myTextBox.Visible, then we can see the message
}

void HideStuff()
{
    myTextBox.Visible = false;
    UpdateStuff();

    // After myDataTable..AcceptChanges(), DataBindings are now BROKEN!
    // This Cleared all data from controls bound to myBindingSource 
    try
    {
        myBindingSource.ResetCurrent();
    }
    catch (Exception brokenBindingSource)
    {
        Console.WriteLine("DataBinding broken" + brokenBindingSource.Message);
    }
}

void HideStuff()
{
    if (myTextBox.Visible)
    {
        myTextBox.DataBindings.Remove("MySecret");
        myTextBox.Visible = false;
    }
    UpdateStuff();

    // After myDataTable..AcceptChanges(), DataBindings are now BROKEN!
    // This Cleared all data from controls bound to myBindingSource 
    try
    {
        myBindingSource.ResetCurrent();
    }
    catch (Exception brokenBiSo)
    {
        Console.WriteLine("DataBinding is broken" + brokenBiSo.Message);
    }
}

void ShowStuff()
{
    // If I want to make the component visible again, do this:
    if (!myTextBox.Visible)
    {
        myTextBox.Visible = true;
        myTextBox.DataBindings.Add("Text", myBindingSource, "MySecret");
    }
}

Autres conseils

Le problème était que j'ai eu une autre propriété liée qui dépend de la valeur sélectionnée. J'ai eu "machine.mode" comme une propriété liée où le type de la propriété de la machine dépend de la propriété PrintType

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top