문제

나는 묶으려고 노력하고있다 DataGridViewComboBoxColumn foo의 인스턴스에, 그러나 그리드에 값을 설정하면 ArgumentException 문자열에서 foo로 변환 할 수 없다고 말합니다.

var data = (from item in someTable
            select new { Foo = item.foo, Bar = item.Bar }).ToList();
grid.DataSource = data;
column.DataPropertyName = "Foo";
column.DataSource = (from foo in Foo select foo).ToList (); //foo is an instance of Foo
column.DisplayMember = "SomeNameField"; //Foo.SomeNameField contains a description of the instance

내가 뭔가를 놓치고 있습니까? 복잡한 객체에 데이터를 할 수 있습니까?

업데이트:

타이프 콘버터를 구현하고 Canconvertfor, Canconvertto, ConvertTo, ConvertFrom을 지나치게 오버레이션했습니다. 이제 나는 받고있다

FormateXception : DataGridViewComboBoxCell 값은 유효하지 않습니다

어떤 아이디어?

도움이 되었습니까?

해결책

당신은 가능한 조각을 놓치고 있습니다.

column.DataPropertyName = "Foo";
column.DisplayMember = "SomeNameField"; 
column.ValueMember = "Bar"; // must do this, empty string causes it to be 
                            // of type string, basically the display value
                            // probably a bug in .NET
column.DataSource = from foo in Foo select foo;
grid.DataSource = data;

업데이트:

실제로, 당신의 질문을 다시 읽은 후에, 나는 당신이 그 버그를 지적하고 있다고 생각합니다. 불행히도 사용자 정의 Typedescriptor/typeconverter/bindingsource를 사용하지 않고 바운드 객체를 반환 할 수있는 방법은 없습니다.

복잡한 물체에 대한 바인딩에 대한 답변. 기본적으로 아니요. 나는 내 현재 프로젝트를 위해 꽤 좋은 것을 썼습니다. 여기에는 모든 중첩 특성을 반환하는 사용자 정의 타이핑 스크립터/타입 콘버터/BindingSource를 작성하는 것이 포함됩니다. 또 다른 '버그', 당신은 사용할 수 없습니다 '. 회원 분리기의 경우 ':'대신에 의지해야했습니다.

다른 팁

DataGridViewComboBoxColumn은 항상 ComboBox 항목 목록에 가능한 모든 값을 갖추어야합니다. 그렇지 않으면 "FormateXception : DataGridViewComboBoxCell 값이 유효하지 않습니다".

하나의 Combobox 열에서 선택한 값을 되 찾으려고하는 경우 DataGridView CellParsing 이벤트를 처리하고 DataGridView.editingControl에서 선택한 항목을 가져올 수 있습니다. 편집 된 열에서 컨트롤 편집으로 설정됩니다. 여기에 예시가 있습니다.

private void dataGridView1_CellParsing(object sender, 
 DataGridViewCellParsingEventArgs e) {
   if (dataGridView1.CurrentCell.OwningColumn is DataGridViewComboBoxColumn) {
       DataGridViewComboBoxEditingControl editingControl = 
                (DataGridViewComboBoxEditingControl)dataGridView1.EditingControl;
       e.Value = editingControl.SelectedItem;
       e.ParsingApplied = true;
   }
}

또한 셀 포맷 이벤트를 처리하여 각 셀에 객체가 표시되는 방식을 사용자 정의 할 수 있습니다. 다음은 객체 또는 인터페이스에 대한 TOSTRING를 표시하는 코드입니다.

private void dataGridView1_CellFormatting(object sender, 
    DataGridViewCellFormattingEventArgs e) {
        if (e.Value != null) {
            e.Value = e.Value.ToString();
            e.FormattingApplied = true;
        }
    } 

이 두 이벤트를 처리하면 Bussiness 객체와 Easer 내에서 데이터를 표시하고 편집하기에 충분해야합니다. 이 작업의 경우 DataGridView 및 ComboBox 열을 다음과 같이 설정하십시오.

var data = (from item in someTable
        select new { Foo = item.foo, Bar = item.Bar }).ToList();
grid.DataSource = data;
column.DataPropertyName = "Foo";
column.DataSource = (from foo in Foo select foo).ToList ();

DisplayMember 또는 valuember 속성을 설정할 필요가 없습니다. ComboBox 데이터 소스 목록에 FOO에 대한 가능한 모든 값이 있는지 확인하십시오.

도움이되기를 바랍니다.

실제로 복잡한 유형을 사용할 수 있습니다 DataGridViewComboBoxColumn.

예를 들어:

DataGridViewComboBoxColumn.DataPropertyName = "ValueMode";
DataGridViewComboBoxColumn.DisplayMember = "Label";
DataGridViewComboBoxColumn.ValueMember = "Self"; *
DataGridViewComboBoxColumn.ValueType = typeof(ValueModeItem);

Self 이다:

public ValueModeItem Self
{
    get
    {
        return this;
    }
}

매우 중요합니다 - 복잡한 유형의 '평등'방법을 무시해야합니다. 나의 경우에는:

public override bool Equals(object obj)
{
    if (obj is ValueModeItem && obj != null)
    {
        if (...)
            return true;
    }
    return false;
}

나는 당신이 설정할 수 없다는 것을 알 때까지 같은 문제를 끊임없이 때렸습니다 DisplayMemberDataGridViewComboBoxCell 설정하지 않고 ValueMember 도.
같은 방식으로, ValueMember 그리고 아닙니다 DisplayMember 또한 실패, 당신은 아무것도 정의 할 필요가 없습니다.

당신의 모델은 foo이며, 당신은 확실히 Combobox의 가치가 항목 자체가되기를 원합니다. 이를 위해 가장 간단한 방법은 Foo에 속성을 만들어 스스로를 돌려주는 것입니다.

public class Foo
{
    ...
    public Foo This { get {return this; } }
}

그런 다음 바인딩은 다음과 같습니다.

column.DataPropertyName = "Foo";
column.DataSource = (from foo in Foo select foo).ToList (); //foo is an instance of Foo
column.DisplayMember = "SomeNameField"; //Foo.SomeNameField contains a description of the instance
column.ValueMember = "This";

이것은 작동해야하며 셀의 값은 예상대로 Foo 형이어야합니다.

흥미로운 참조 : DataGridViewComboBoxColumn의 문제

그러나 DataGridViewComboBoxColumn은 이와 같이 작동하지 않지만 DisplayMember를 설정하지 않으면 TOSTRING 값을 표시하지만 선택한 시합을 찾으려고 할 때 내부적으로 잘못된 것이 있습니다. DisplayMember를 공개 속성으로 설정해야합니다. 당신의 수업. 더 나쁜 것은, Valuemember 속성을 설정하지 않으면 기본 동작은 DisplayMember를 반환하는 것입니다. 실제 항목 자체를 얻는 방법은 없습니다. 주변의 유일한 작업은 수업에 재산을 추가하여 자체를 반환하고 해당 재산을 평가자에게 설정하는 것입니다. 물론, 항목이 변경할 수있는 것이 아니라면 (프레임 워크 클래스 중 하나와 같은) 항목에 대한 참조가있는 컨테이너 객체를 함께 클러지해야합니다.

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