Il databinting non riesce a trovare una riga nell'elenco che è adatto a tutti i binding utilizzando RadioButton Group con oltre 9 nel Gruppo

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

  •  21-12-2019
  •  | 
  •  

Domanda

Sto usando la tecnica descritta qui Per aggiungere gruppi dei pulsanti radio alla mia applicazione di WinForms C #.

La tecnica funziona magnificamente finché non provo un pulsante di opzione con un tag superiore a 9.

In questo caso si verifica un errore quando faccio clic sul pulsante di opzione

.

System.invalidOperationException era non gestito Hresult= -2146233079
MESSAGGIO= DataBinduting non riesce a trovare una riga nell'elenco adatto per tutti i leganti. Source= Stacktrace del sistema: presso System.ComponentModel.reflectPropertyDescriptor.setValue (oggetto Componente, valore oggetto) A System.Windows.Forms.bindtoObject.setValue (valore oggetto) presso System.Windows.Forms.binding.pulldata (riformat booleano, forza booleana) A System.Windows.Forms.binding.target_propertyChanged (mittente di oggetti, EventArgs e) A System.EventHandler.invoke (mittente di oggetti, EventArgs e) su sbd.vivsnap.ui.radiogroupbox.radiobutton_checkedchanged (mittente di oggetti, Eventgs e) in E: \ Eshared \ devnet10 \ vivsnap \ snapinui \ radiogruppo.cs: linea 70 A System.EventHandler.invoke (mittente di oggetti, EventArgs e) A System.Windows.Forms.RADIOBUTTON.AlClick (EventArGS e) A System.Windows.Forms.RADIOBUTTON.ONMOURYUP (Mouseventargs MEVENT) su System.Windows.Forms.Control.wMMousep (Message & M, MouseButtons Button, INT32 clicks) su System.Windows.Forms.Control.wndProc (Message & m) su System.Windows.Forms.buttonbase.wndProc (Message & M) su System.Windows.Forms.nativewindow.deBuggAbleCallback (INTPTR HWND, INT32 MSG, INTPTR WPARAM, INTPTR LPARRAM) presso System.Windows.Forms.unsafenativivemethods.dispatchmessagew (msg & msg) presso System.Windows.Forms.Application.ComponentManager.system.Windows.Forms.unsafenativemethods.imsocomponentmanager.fshmessageloop (INTPTR Dwcomponentid, INT32 Motivo, INT32 PVLOOPDATA) presso System.Windows.Forms.Application.ThreadContext.RunmessaGeloOopinner (INT32 Motivo, contesto di applicazioniContext) a System.Windows.Forms.Application.ThreadContext.RunmessaGeloop (INT32 Motivo, contesto di applicazioniContext) su System.Windows.Forms.Form.ShowDialog (iWin32Window proprietario) su sbd.vivsnap.main.form1.btnform1go_click (oggetto mittente, eventgs e) in E: \ Eshared \ devnet10 \ vivsnap \ main \ form1.cs: linea 36 a System.Windows.Forms.button.onmouseup (Mouseventargs Mevent) su System.Windows.Forms.Control.wMMousep (Message & M, MouseButtons Button, INT32 clicks) su System.Windows.Forms.Control.wndProc (Message & m) su System.Windows.Forms.buttonbase.wndProc (Message & M) su System.Windows.Forms.button.wndProc (Message & m) su System.Windows.Forms.nativewindow.deBuggAbleCallback (INTPTR HWND, INT32 MSG, INTPTR WPARAM, INTPTR LPARRAM) presso System.Windows.Forms.unsafenativivemethods.dispatchmessagew (msg & msg) presso System.Windows.Forms.Application.ComponentManager.system.Windows.Forms.unsafenativemethods.imsocomponentmanager.fshmessageloop (INTPTR Dwcomponentid, INT32 Motivo, INT32 PVLOOPDATA) presso System.Windows.Forms.Application.ThreadContext.RunmessaGeloOopinner (INT32 Motivo, contesto di applicazioniContext) a System.Windows.Forms.Application.ThreadContext.RunmessaGeloop (INT32 Motivo, contesto di applicazioniContext) su sbd.vivsnap.main.program.main () in E: \ Eshared \ devnet10 \ vivsnap \ principale \ programma.cs: linea 18 A System.AppDomain._NexecuteAssESembly (assembly runtimeaseeSembly, string [] args) a Microsoft.VisualStudio.hostingProcess.hostproc.RunuseSersAssembly () a System.Threading.executionContext.Runinternal (ExecutionContext EsecuzioneContext, ContextCallback Richiamata, Stato dell'oggetto, Booleano preservasyncctx) a System.Threading.ExecutionContext.Run (EsecuzioneContext EsecuzioneContext, ContextCallback Richiamata, Stato dell'oggetto, Boolean preservasyncctx) su System.Threading.executionContext.Run (EsecuzioneContext EsecuzioneContext, ContextCallback Richiamata, Stato dell'oggetto) A System.Threading.ThreadHelper.Threadstart () InniserException:

Il mio codice per vincolante La proprietà è

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

Il mio codice per la proprietà è

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

**

[Aggiornamento] Ho appena scoperto che non ottengo l'errore se la proprietà è altrettanto la seguente.

public int PrinterTypeNum { get; set; }
.

La mia classe del gruppo radio è il seguente // miglior modo per modificare un gruppo di radiobuttons in 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
        }
    }
}
.

È stato utile?

Soluzione

Ho ricevuto questo errore quando ho cambiato la proprietà .Visible su FALSE in uno dei componenti rilegati ai dati.

Il lavoro in giro è quello di rimuovere i databactioning sui controlli prima di modificare la propria proprietà .Visible su False, aggiungendo nuovamente i dati del database quando li rendono visibili.

Ecco il codice per illustrare l'errore e come lavorarlo:

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

Altri suggerimenti

Il problema era perché ho avuto un'altra proprietà legata che dipendeva dal valore selezionato. Ho avuto "Machine.Mode" come proprietà rilegata in cui il tipo di proprietà della macchina dipendeva dalla proprietà PrintType

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top