DATABINDING не может найти строку в списке, подходящей для всех привязки, использующих Radiobutton Group, с более чем 9 в группе

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

  •  21-12-2019
  •  | 
  •  

Вопрос

Я использую технику, описанную описанную здесь Добавить группы моих радиопередачи на мое приложение C # WinForms.

Техника красиво работает, пока не попробую переключательную кнопку с тегом больше 9.

В этом случае ошибка возникает, когда я нажимаю на кнопку радио

System.invalidOperationException был необработанным hresult= -2146233079 Message= data dindingsing не может найти строку в списке, который подходит для все привязки. Source= System Stacktrace: На System.comPonentModel.reflectPropertyDescriptor.SetValue (объект Компонент, значение объекта) в System.windows.forms.bindToObject.SetValue (объектное значение) в System.windows.forms.binding.pulldata (Boolean Reformat, Boolean Force) в System.Windows.forms.binding.target_propertyChanged (отправитель объекта, eventargs e) в system.eventhandler.invoke (отправитель объекта, eventargs e) на sbd.vivsnap.ui.radioGroupbopbox.radiobutton_checkedChanged (отправитель объекта, Eventargs e) в E: \ Ezhared \ devnet10 \ vivsnap \ snapinui \ Radiogroupbopp.cs: линия 70 в system.eventhandler.invoke (отправитель объекта, eventargs e) в System.windows.forms.radiobutton.onclick (eventargs e) в System.windows.forms.radiobutton.onmouseup (MouseEventargs Mevent) В System.Windows.forms.Control.wmmouseup (Message & M, кнопка MouseButtons, int32 clicks) в System.windows.forms.Control.wndProc (Message & M) в System.windows.forms.buttonbase.wndproc (сообщение & m) В System.windows.forms.nativeWindow.debuggableCallback (INTPTR HWND, INT32 MSG, INTPTR WPARAM, INTPTR LPARAM) В System.windows.forms.unsafenativemethods.dispatchmessagew (msg & msg) в System.Windows.forms.application.componentmanager.system.windows.forms.unsafenativemethods.imsocomponentmanager.fpushmessageleoop (Intptr dwcomponentid, int32 Причина, int32 pvloopdata) в System.windows.forms.application.Threadcontext.runmessageLoopinner (INT32 Причина, ApplicationContext Context) в System.Windows.forms.application.Threadcontext.runmessageLoop (INT32 Причина, ApplicationContext Context) в System.Windows.forms.form.showdialog (Iwin32Window владелец) На SBD.vivsnap.main.form1.btnform1go_click (объект отправителя, eventargs e) в E: \ Ezhared \ devnet10 \ vivsnap \ main \ form1.cs: линия 36 в System.windows.forms.button.onmouseup (MouseEventargs Mevent) В System.Windows.forms.Control.wmmouseup (Message & M, кнопка MouseButtons, int32 clicks) в System.windows.forms.Control.wndProc (Message & M) в System.windows.forms.buttonbase.wndproc (сообщение & m) в System.windows.forms.button.wndproc (сообщение & m) В System.windows.forms.nativeWindow.debuggableCallback (INTPTR HWND, INT32 MSG, INTPTR WPARAM, INTPTR LPARAM) В System.windows.forms.unsafenativemethods.dispatchmessagew (msg & msg) в System.Windows.forms.application.componentmanager.system.windows.forms.unsafenativemethods.imsocomponentmanager.fpushmessageleoop (Intptr dwcomponentid, int32 Причина, int32 pvloopdata) в System.windows.forms.application.Threadcontext.runmessageLoopinner (INT32 Причина, ApplicationContext Context) в System.Windows.forms.application.Threadcontext.runmessageLoop (INT32 Причина, ApplicationContext Context) at sbd.vivsnap.main.program.main () в e: \ eşared \ devnet10 \ vivsnap \ main \ program.cs: линия 18 в System.Appdomain._nexecuteasSembly (Runtimeass см. Сборка, строка [] args) в Microsoft.visualStudio.hostingProcess.hostProc.runusersAssAssAseMbly () При System.threading.executionContext.runinternal (ExecutionContext ExecutionContext, ContextCallback Chanceback, Объектное состояние, Boolean preservesyncctx) При System.Threading.executionContext.RUN (ExecutionContext ExecutionContext, ContextCallback Callback, состояние объекта, Boolean preservesyncctx) При System.threading.executionContext.RUN (ExecutionContext ExecutionContext, ContextCallback Callback, объект) При системе.threading.threadhelper.threadStart () Innerexception:

Мой код для привязки свойство -

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

Мой код для свойства составляет

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

**

[Обновление] Я только что обнаружил, что я не получаю ошибку, если свойство выглядит следующим образом.

public int PrinterTypeNum { get; set; }
.

Мой класс радиогруппы выглядит следующим образом // Лучший способ ДАН DATABIND Группа радиообуток

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

Это было полезно?

Решение

Я получил эту ошибку, когда я поменял свойство .Visible в FALSE в одном из компонентов данных.

Работа вокруг состоит в том, чтобы удалить databindings на элементы управления перед изменением свойства своего генеракодицетагкода в false, затем добавляя данные databindings, при этом еще раз видно.

Вот код, чтобы проиллюстрировать ошибку и как работать вокруг него:

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

Другие советы

Проблема была, потому что у меня была еще одна связанная собственность, который зависел от выбранного значения. У меня был «Machine.mode» в качестве связанного свойства, в котором тип свойства машины зависел от свойства PrintType

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top