Die Datenbindung kann keine Zeile in der Liste finden, die für alle Bindungen geeignet ist, die eine RadioButton-Gruppe mit mehr als 9 in der Gruppe verwenden

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

  •  21-12-2019
  •  | 
  •  

Frage

Ich benutze die beschriebene Technik hier so fügen Sie meiner C # Winforms-Anwendung Gruppen meiner Optionsfelder hinzu.

Die Technik funktioniert wunderbar, bis ich ein Optionsfeld mit einem Tag größer als 9 ausprobiere.

In diesem Fall tritt ein Fehler auf, wenn ich auf das Optionsfeld klicke

System.InvalidOperationException wurde nicht behandelt HResult = -2146233079
Message=DataBinding kann keine Zeile in der Liste finden, die für Folgendes geeignet ist alle Bindungen.Quelle = System-StackTrace:im System.Komponentenmodell.ReflectPropertyDescriptor.setValue(Objekt komponente, Objektwert) im System.Windows.Forms.BindToObjekt.setValue(Objektwert) im System.Windows.Forms.Verbindlich.PullData(Boolesche Formatierung, Boolesche Kraft) im System.Windows.Forms.Verbindlich.Target_PropertyChanged(Objektsender, Ereignisargs e) im System.EventHandler.Aufrufen (Objektsender, Ereignisarge e) bei SBD.VivSnap.BENUTZEROBERFLÄCHE.Radiogruppenbox.radioButton_CheckedChanged(Objekt Absender, Ereignisargen e) in e:\EShared\devnet10\VivSnap\SnapInUI adioGroupBox .cs:Linie 70 im System.EventHandler.Aufrufen (Objektsender, Ereignisarge e) im System.Windows.Forms.Radioknopf.OnClick(Ereignisargumente e) im System.Windows.Forms.Radioknopf.OnMouseUp(MouseEventArgs-Ereignis) im System.Windows.Forms.Kontrolle.WmMouseUp (Nachricht & m, Maustasten, Int32 Klicks) im System.Windows.Forms.Kontrolle.WndProc(Nachricht& m) im System.Windows.Forms.Knopfleiste.WndProc(Nachricht& m) im System.Windows.Forms.Natives Fenster.DebuggableCallback(IntPtr hWnd, Int32 Nachricht, IntPtr wparam, IntPtr lparam) im System.Windows.Forms.Unsichere Methoden.Versandnachrichtw (MSG& msg) im System.Windows.Forms.Anwendung.Komponentenmanager.System.Windows.Forms.Unsichere Methoden.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 Grund, Int32 pvLoopData) im System.Windows.Forms.Anwendung.ThreadKontext.RunMessageLoopInner(Int32) ausführen grund, Anwendungskontextkontext) im System.Windows.Forms.Anwendung.ThreadKontext.RunMessageLoop(Int32 grund, Anwendungskontextkontext) im System.Windows.Forms.Form.ShowDialog (IWin32Window Besitzer) bei SBD.VivSnap.Wichtigsten.Formblatt 1.btnForm1Go_Click(Objekt Absender, Ereignisargs e) in e:\EShared\devnet10\VivSnap\Main\Form1 .cs:Linie 36 im System.Windows.Forms.Schaltfläche.OnMouseUp(MouseEventArgs-Ereignis) im System.Windows.Forms.Kontrolle.WmMouseUp (Nachricht & m, Maustasten, Int32 Klicks) im System.Windows.Forms.Kontrolle.WndProc(Nachricht& m) im System.Windows.Forms.Knopfleiste.WndProc(Nachricht& m) im System.Windows.Forms.Schaltfläche.WndProc(Nachricht& m) im System.Windows.Forms.Natives Fenster.DebuggableCallback(IntPtr hWnd, Int32 Nachricht, IntPtr wparam, IntPtr lparam) im System.Windows.Forms.Unsichere Methoden.Versandnachrichtw (MSG& msg) im System.Windows.Forms.Anwendung.Komponentenmanager.System.Windows.Forms.Unsichere Methoden.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 Grund, Int32 pvLoopData) im System.Windows.Forms.Anwendung.ThreadKontext.RunMessageLoopInner(Int32) ausführen grund, Anwendungskontextkontext) im System.Windows.Forms.Anwendung.ThreadKontext.RunMessageLoop(Int32 grund, Anwendungskontextkontext) bei SBD.VivSnap.Wichtigsten.Programm.Haupt() in e:\EShared\devnet10\VivSnap\Main\Program .cs:Linie 18 im System.AppDomäne._nExecuteAssembly (Laufzeitassembly-Assembly, String [] Argumente) bei Microsoft.Visuelles Studio.HostingProzess.Hostverfahren.RunUsersAssembly() ausführen im System.Einfädeln.Ausführungskontext.RunInternal(Ausführungskontext Ausführungskontext, KontextCallback-Callback, Objektzustand, Boolean preserveSyncCtx) im System.Einfädeln.Ausführungskontext.Run(ExecutionContext ExecutionContext, ContextCallback-Rückruf, Objektzustand, boolescher Wert preserveSyncCtx) im System.Einfädeln.Ausführungskontext.Ausführen(ExecutionContext ExecutionContext, ContextCallback Callback, Objektzustand) im System.Einfädeln.Fadenhelfer.ThreadStart () Innere Ausnahme:

Mein Code zum Binden der Eigenschaft lautet

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

Mein Code für die Immobilie lautet

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; }

**

[Update] Ich habe gerade festgestellt, dass ich den Fehler nicht erhalte, wenn die Eigenschaft genau wie folgt lautet.

public int PrinterTypeNum { get; set; }

Meine Radiogruppenklasse ist wie folgt //Der beste Weg, um eine Gruppe von Radiobuttons in WinForms zu binden

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
        }
    }
}
War es hilfreich?

Lösung

Ich habe diesen Fehler erhalten, als ich das geändert habe .Visible eigenschaft auf false in einer der datengebundenen Komponenten.

Die Problemumgehung besteht darin, Datenbindungen auf Steuerelementen zu entfernen, bevor ihre geändert werden .Visible eigenschaft auf false setzen und dann die Datenbindungen wieder hinzufügen, wenn sie wieder sichtbar gemacht werden.

Hier ist Code, um den Fehler zu veranschaulichen und wie man ihn umgeht:

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");
    }
}

Andere Tipps

Das Problem war, weil ich eine andere Eigenschaft gebunden hatte, die von dem ausgewählten Wert abhängt. Ich hatte "maschinen.mode" als gebundene Eigenschaft, in der der Typ der Maschineneigenschaft von der Printtype-Eigenschaft abhängt

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top