El enlace de datos no se puede encontrar una fila de la lista que es adecuado para todos los enlaces utilizando Grupo de RadioButton con más de 9 en el grupo

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

  •  21-12-2019
  •  | 
  •  

Pregunta

Estoy utilizando la técnica descrita aquí para agregar Grupos de mis botones de radio para mi C# winforms aplicación.

La técnica funciona de maravilla hasta que me trate de un botón de radio con una etiqueta mayor que 9.

En este caso se produce un error cuando hago clic en el botón de radio

Sistema.InvalidOperationException fue no controlada HResult=-2146233079
Mensaje=Enlace de datos no se puede encontrar una fila de la lista que es adecuado para todos los enlaces.Fuente=Sistema De StackTrace:en el Sistema.ComponentModel.ReflectPropertyDescriptor.SetValue(Objeto componente, Objeto de valor) en el Sistema.Windows.Los formularios.BindToObject.SetValue(Object valor) en el Sistema.Windows.Los formularios.De unión.PullData(Boolean volver a formatear, Boolean fuerza) en el Sistema.Windows.Los formularios.De unión.Target_PropertyChanged(Object sender, EventArgs e) en el Sistema.EventHandler.Invoke(Object sender, EventArgs e) en SBD.VivSnap.La interfaz de usuario.RadioGroupBox.radioButton_CheckedChanged(Object sender, EventArgs e) en e:\EShared\devnet10\VivSnap\SnapInUI adioGroupBox.cs:línea 70 en el Sistema.EventHandler.Invoke(Object sender, EventArgs e) en el Sistema.Windows.Los formularios.RadioButton.OnClick(EventArgs e) en el Sistema.Windows.Los formularios.RadioButton.OnMouseUp(MouseEventArgs mevent) en el Sistema.Windows.Los formularios.De Control.WmMouseUp(Mensaje& m, MouseButtons botón, Int32 clics) en el Sistema.Windows.Los formularios.De Control.WndProc(Mensaje& m) en el Sistema.Windows.Los formularios.ButtonBase.WndProc(Mensaje& m) en el Sistema.Windows.Los formularios.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) en el Sistema.Windows.Los formularios.UnsafeNativeMethods.DispatchMessageW(MSG& msg) en System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 razón, Int32 pvLoopData) en el Sistema.Windows.Los formularios.Aplicación.ThreadContext.RunMessageLoopInner(Int32 la razón, ApplicationContext contexto) en el Sistema.Windows.Los formularios.Aplicación.ThreadContext.RunMessageLoop(Int32 la razón, ApplicationContext contexto) en el Sistema.Windows.Los formularios.El formulario.ShowDialog(propietario IWin32Window) en SBD.VivSnap.Principal.Form1.btnForm1Go_Click(Object sender, EventArgs e) en e:\EShared\devnet10\VivSnap\Main\Form1.cs:line 36 en el Sistema.Windows.Los formularios.El botón.OnMouseUp(MouseEventArgs mevent) en el Sistema.Windows.Los formularios.De Control.WmMouseUp(Mensaje& m, MouseButtons botón, Int32 clics) en el Sistema.Windows.Los formularios.De Control.WndProc(Mensaje& m) en el Sistema.Windows.Los formularios.ButtonBase.WndProc(Mensaje& m) en el Sistema.Windows.Los formularios.El botón.WndProc(Mensaje& m) en el Sistema.Windows.Los formularios.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) en el Sistema.Windows.Los formularios.UnsafeNativeMethods.DispatchMessageW(MSG& msg) en System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 razón, Int32 pvLoopData) en el Sistema.Windows.Los formularios.Aplicación.ThreadContext.RunMessageLoopInner(Int32 la razón, ApplicationContext contexto) en el Sistema.Windows.Los formularios.Aplicación.ThreadContext.RunMessageLoop(Int32 la razón, ApplicationContext contexto) en SBD.VivSnap.Principal.Programa.Main() en e:\EShared\devnet10\VivSnap\Main\Program.cs:line 18 en el Sistema.Dominio de aplicación._nExecuteAssembly(RuntimeAssembly asamblea, String[] args) en Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() en el Sistema.Las operaciones de roscado.ExecutionContext.RunInternal(ExecutionContext executionContext, devolución de llamada ContextCallback, el estado del Objeto, Boolean preserveSyncCtx) en el Sistema.Las operaciones de roscado.ExecutionContext.Ejecutar(ExecutionContext executionContext, devolución de llamada ContextCallback, el estado del Objeto, Boolean preserveSyncCtx) en el Sistema.Las operaciones de roscado.ExecutionContext.Ejecutar(ExecutionContext executionContext, devolución de llamada ContextCallback, el estado del Objeto) en el Sistema.Las operaciones de roscado.ThreadHelper.ThreadStart() InnerException:

Mi código para la unión de la propiedad es

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

Mi código de la propiedad es

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

**

[Actualización] acabo de descubrir que no me sale el error si la propiedad es tal como sigue.

public int PrinterTypeNum { get; set; }

Mi Grupo de Radio de la clase es la siguiente //La mejor manera de enlazar un grupo de botones de radio en 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
        }
    }
}
¿Fue útil?

Solución

Tengo este error cuando he cambiado el .Visible propiedad en false en uno de enlazado de datos de componentes.

El trabajo es para Quitar DataBindings en los controles antes de cambiar su .Visible propiedad en false, luego añadir la DataBindings espalda cuando haciéndolos visibles de nuevo.

Aquí está el código para ilustrar el error y cómo trabajar alrededor de ella:

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

Otros consejos

El problema fue porque tenía otra propiedad obligada que dependía del valor seleccionado. Tuve "Machine.Mode" como una propiedad enlazada donde el tipo de propiedad de la máquina dependía de la propiedad PrintType

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top