DataBinding은 그룹에서 9 개가 넘는 RadioButton 그룹을 사용하여 모든 바인딩에 적합한 목록에서 행을 찾을 수 없습니다.

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

  •  21-12-2019
  •  | 
  •  

문제

기술을 사용하고 있습니다 여기 내 라디오 버튼 그룹을 내 C # WinForms 응용 프로그램에 추가하려면

기술은 9 개 이상의 태그가있는 라디오 버튼을 사용해 낼 때까지는 아름답게 작동합니다.

이 경우 라디오 버튼을 클릭하면 오류가 발생합니다.

System.InvalidOperationException은 처리되지 않았습니다. HRESULT= -2146233079
message= 데이터 바인딩은 적합한 목록에서 행을 찾을 수 없습니다. 모든 바인딩. Source= System StackTrace : system.componentmodel.reflectpropertydescriptor.setvalue (객체) 구성 요소, 객체 값) system.windows.forms.bindtoobject.setValue (객체 값) system.windows.forms.binding.pulldata (부울 재 포맷, 부울 힘) system.windows.forms.binding.target_propertychanged (Object Sender, EventArgs e) system.eventhandler.invoke (Object Sender, EventArgs e) sbd.vivsnap.ui.radiogroupbox.radiobutton_checkedchanged (객체 보낸 사람, eventargs e) E : \ EShared \ DevNet10 \ Vivsnap \ SnapinUI \ RadioGroupBox.cs : 70 system.eventhandler.invoke (Object Sender, EventArgs e) system.windows.forms.radiobutton.onclick (eventargs e) system.windows.forms.radiobutton.onmouseup (MouseEventArgs mevent) system.windows.forms.control.wmmouseup (메시지 & M, MouseButtons 버튼, Int32 클릭) system.windows.forms.control.wndProc (메시지 & 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.fpushmessageloop (intptr. DWComPonentID, Int32 이유, Int32 PvloopData) system.windows.forms.application.ThreadContext.RunMessageloopinner (Int32.) 이유, applicationContext 컨텍스트) system.windows.forms.Application.ThreadContext.RunMessageloop (Int32. 이유, applicationContext 컨텍스트) system.windows.forms.form.showdialog (iWin32Window 소유자) e : \ eshared \ devnet10 \ vivsnap \ main \ form1.cs : line 36에서 sbd.vivsnap.main.form1.bornform1go_click (object resear, eventargs e) system.windows.forms.button.onmouseup (mouseeventargs mevent) system.windows.forms.control.wmmouseup (메시지 & M, MouseButtons 버튼, Int32 클릭) system.windows.forms.control.wndProc (메시지 & 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.fpushmessageloop (intptr. DWComPonentID, Int32 이유, Int32 PvloopData) system.windows.forms.application.ThreadContext.RunMessageloopinner (Int32.) 이유, applicationContext 컨텍스트) system.windows.forms.Application.ThreadContext.RunMessageloop (Int32. 이유, applicationContext 컨텍스트) sbd.vivsnap.main.program.main () e : \ eshared \ devnet10 \ vivsnap \ main \ program.cs : 18 행 system.appdomain._nexecuteassembly (runtimeassembly 어셈블리, String [] args) microsoft.visualstudio.hostingprocess.hostproc.runusersassembly () System.Threading.ExecutionContext.RunInternal (실행중인 executionContext, contextCallback 콜백, object state, boolean. preservesyncctx) System.Threading.ExecutionContext.Run (실행 Context ExecutionContext, ContextCallback 콜백, 개체 상태, 부울 preservesyncctx) System.Threading.ExecutionContext.Run (실행 Context ExecutionContext, ContextCallback 콜백, 개체 상태) System.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; }
.

**

[UPDATE] 나는 그 속성이 다음과 같은 경우 오류가 발생하지 않는다는 것을 발견했습니다.

public int PrinterTypeNum { get; set; }
.

내 무선 그룹 클래스는 다음과 같습니다. // Winforms에서의 RadioButtons 그룹을 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로 변경했을 때이 오류가 발생했습니다.

Throughing은 Per .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 속성에 의존하는 Machine 속성의 유형이

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top