Il databinting non riesce a trovare una riga nell'elenco che è adatto a tutti i binding utilizzando RadioButton Group con oltre 9 nel Gruppo
-
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
}
}
}
. 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