DataBinding não consegue encontrar uma linha na lista que seja adequada para todas as ligações usando RadioButton Group com mais de 9 no grupo

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

  •  21-12-2019
  •  | 
  •  

Pergunta

Estou usando a técnica descrita aqui para adicionar grupos de meus botões de opção ao meu aplicativo winforms C#.

A técnica funciona perfeitamente até que eu experimente um botão de opção com tag maior que 9.

Neste caso, ocorre um erro quando clico no botão de opção

System.InvalidOperationException não foi tratada HResult=-2146233079
Mensagem = O banco de dados não pode encontrar uma linha na lista adequada para todas as ligações.Fonte=Sistema StackTrace:em System.comPonentModel.ReflectPropertyDescriptor.SetValue (componente do objeto, valor do objeto) em System.Windows.Forms.BindtoObject.SetValue (Valor do objeto) em System.Windows.Forms.Binding.Pulldata (reforma booleano, força booleana) em System.Windows .Forms.Binding.Target_PropertyChanged(Object sender, EventArgs e) at System.EventHandler.Invoke(Object sender, EventArgs e) at SBD.VivSnap.UI.RadioGroupBox.radioButton_CheckedChanged(Object sender, EventArgs e) in e:EShareddevnet10 Vivsnap snapinui radiogroupbox.cs: linha 70 em system.eventhandler.invoke (remetente de objeto, eventArgs e) em system.windows.forms.radiobutton.onClick (eventArgs e) em sistemas.windows.forms.Radiobutton.OnmouseUp (mouseups e) em system.gindows.fort.Radiobutton.OnmouseUp (mousearps e) em system.gindows.fortiObutton.OnmouseUp (mouseargs e) em system.gindows.radiobutton.onmousep (moureews e) em system.gindows.radiobutton.onmouseUp (mousearps e) em system.gindows.radiobutton.OnmouseUp (mouseargs e). mevent) em system.windows.forms.control.wmmouseUp (Message & M, MouseButtons Button, Int32 Cliques) em system.windows.forms.control.wndproc (mensagem & m) em system.windows.forms.buttonbase.wndproc (mensagem & m) at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) at System.Windows.Forms.Application.ComponentManager.System. Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData) at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) at System.Windows.Forms.Application.ThreadContext.RunMessageLoop (Int32 reason, ApplicationContext context) at System.Windows.Forms.Form.ShowDialog(IWin32Window owner) at SBD.VivSnap.Main.Form1.btnForm1Go_Click(Object sender, EventArgs e) in e:EShareddevnet10VivSnapMain Form1.cs: linha 36 em system.windows.forms.button.onmouseUp (mouseeventargs mevent) em system.windows.forms.control.wmmouseUp (mensagem e mousebuttons botão, int32 cliques) em system.windows.forms.control.wndproc, cliques int32) em system.windows.forms.control.wndproc, (Message & M) em System.Windows.Forms.ButtonBase.WndProc (Message & M) em System.Windows.Forms.Button.Wndproc (Message & M) em System.Windows.Forms.NativeWindow.DeBuggablAlcAllback (intptr hwnd, int32 msg, intptr, intptr wparam, IntPtr lparam) at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData ) em system.windows.forms.application.threadcontext.runmessageLoopinner (INT32 Razão, ApplicationContext Context) em System.Windows.Forms.Application.ThreadContext.runmessageloop (Int32 Razão, ApplicationCext) em sbd.vivsnap.main.main.promerm.program. ) em E: EShared Devnet10 Vivsnap Main Program.cs: Linha 18 em System.AppDomain._nexecutesEssymbly (Assembléia RuntimESEMBLY, String [] args) em Microsoft.VisualStudio.HostingProcess.Hosturing.RunSerserSemkly () em SystemerSerserSantymbly () em). .ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback de retorno de chamada, objeto estado) em system.threading.threadhelper.threadstart () innerexception:

Meu código para vincular a propriedade é

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

Meu código para a propriedade é

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

**

[Atualização] Acabei de descobrir que não recebo o erro se a propriedade for a seguinte.

public int PrinterTypeNum { get; set; }

Minha classe Radio Group é a seguinte //Melhor maneira de vincular dados a um grupo de botões de opção no 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
        }
    }
}
Foi útil?

Solução

Recebi esse erro quando mudei o .Visible propriedade para false em um dos componentes vinculados a dados.

A solução alternativa é remover DataBindings nos controles antes de alterar seus .Visible propriedade para false e, em seguida, adicione os DataBindings novamente ao torná-los visíveis novamente.

Aqui está o código para ilustrar o erro e como contorná-lo:

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

Outras dicas

O problema era porque eu tinha outra propriedade vinculada que dependia do valor selecionado.Eu tinha "Machine.Mode" como uma propriedade vinculada onde o tipo da propriedade Machine dependia da propriedade PrintType

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top