لا يمكن لـ DataBinding العثور على صف في القائمة مناسب لجميع الارتباطات باستخدام RadioButton Group مع أكثر من 9 في المجموعة

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

  •  21-12-2019
  •  | 
  •  

سؤال

أنا أستخدم التقنية الموصوفة هنا لإضافة مجموعات من أزرار الاختيار الخاصة بي إلى تطبيق C# winforms.

تعمل هذه التقنية بشكل جميل حتى أحاول استخدام زر اختيار يحمل علامة أكبر من 9.

في هذه الحالة يحدث خطأ عندما أقوم بالنقر فوق زر الاختيار

لم تتم معالجة System.InvalidOperationException HResult=-2146233079
Message = Databinding لا يمكن العثور على صف في القائمة المناسبة لجميع الروابط.المصدر = نظام StackTrace:في system.componentmodel.reflectpropertydescriptor.setvalue (مكون الكائن ، قيمة الكائن) في system.windows.forms.bindtoObject.setValue (قيمة الكائن) في system.windows.forms.binding.pulldata (Royloan reformat ، boolean orge) في system.windows .forms.binding.target_propertyChanged (مرسل الكائن ، eventargs e) في system.eventHandler.invoke (مرسل الكائن ، eventArgs e) في sbd.vivsnap.ui.radiogroupbox.radiobutton_checkedchanged (sender ، eventargs e) e) vivsnap snapinui radiogroupbox.cs: السطر 70 في system.eventHandler.invoke (مرسل الكائن ، eventargs e) في system.windows.forms.radiobutton.onclick (eventargs e) at system.windows.fords.radiobutton.onmouse Mevent) في System.windows.forms.control.wmmouseup (Message & M ، زر Mousebuttons ، int32) في system.windows.forms.control.wndproc (message & m) في system.windows.forms.buttonbase.wndproc (message & m) في system.windows.forms.nativeWindow.debuggableCallback (Intptr HWND ، INT32 MSG ، Intptr wparam ، intptr lparam) في system.windows.forms.unsafenativemethods.dispatchmessagew (msg & msg) at System.Windows.Forms.Application.com. windows.forms.unsafenativemethods.imsocomponentManager.fpushmessageLoop (intptr dwComponentId ، int32 سبب ، int32 pvloopdata) في system.windows.forms.Application.ThreadContext.RunMessageloPinner (int32 extreext) atextaTeD.ArdationStaGtAgplicationS.ArdationStaGtAgplication. (int32 سبب ، ApplicationContext Context) في system.windows.forms.form.showdialog (iwin32window مالك) في sbd.vivsnap.main.form1.btnform1go_click (مرسل الكائن ، eventargs e) في e: ishared devnet10 vivsnap main main form1.cs: السطر 36 في system.windows.forms.button.onmouseup (mouseeventargs mevent) في system.windows.forms.control.wmmouseup (message & m ، mousebuttons button ، int32 clicks) على system.windows.forms.control.wndproc (Message & M) في System.windows.forms.buttonbase.wndproc (Message & M) في System.windows.forms.button.wndproc (Message & 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.componentMonager.windows.forms.unsafenateMethodmonageR.ImsOcompmonanager.fpushmessmessmess. ) في system.windows.forms.application.ThreadContext.RunMessageLoopinner (int32 السبب ، سياق ApplicationContext) في system.windows.forms.application.ThreadContext.RunMessageloop (int32 ، سياق ApplicationContext) في sbd.vivsnap.main.main.Main ) في e: eShared devnet10 vivsnap main program.cs: السطر 18 في system.appdomain._nexecuteassembly (RunTimeasSembly Assembly ، String [] args) في microsoft.visualstudio.hostingprocess.hostproc. .executioncontext.runinternal (executionContext executionContext ، contextCallback callback ، حالة الكائن ، المحافظ المنطقي) ContextCallback Callback ، حالة الكائن) في System.Threading.ThreadHelper.ThreadStart () inserexception:

الكود الخاص بي لربط الخاصية هو

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

فئة مجموعة الراديو الخاصة بي هي كما يلي //أفضل طريقة لربط البيانات بمجموعة من أزرار الاختيار في 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
        }
    }
}
هل كانت مفيدة؟

المحلول

لقد حصلت على هذا الخطأ عندما قمت بتغيير .Visible خاصية خطأ في أحد مكونات البيانات المرتبطة.

يتمثل الحل البديل في إزالة DataBindings من عناصر التحكم قبل تغييرها .Visible الخاصية إلى 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