2009-06-02 2 views
5

DataGridView를 만들고 디자이너를 사용하여 DataGridViewImageColumn을 추가했습니다.DataGridViewImageColumn 빨강 x

DataGridView에 "AllowUserToAddRows = true"가 있으므로 사용자가 새 행을 입력 할 수 있도록 빈 행이 표시됩니다.이 빈 행에는 DataGridViewImageColumn에 빨간색 x가 표시됩니다. 행에 데이터가 있는지 여부에 관계없이 항상 동일한 이미지를 열에 표시하려고합니다 (DataGridViewImageColumn을 버튼으로 사용하여 셀의 클릭 이벤트를 바인딩하고 있습니다).

어떻게하면 빨간색 x를 제거 할 수 있습니까?

+0

행에 데이터가없는 경우 표시/표시되는 이유는 무엇입니까? – Cerebrus

+0

Cerebrus, "AllowUserToAddRows = true"로 인해 빈 행이 표시됩니다. 이 질문을 포함하도록 질문을 수정했습니다. –

답변

4

나는 모든 이미지를 담기 위해 ImageList를 사용하지만, 여기에는 도움이 될만한 축소 된 버전이 있습니다. 값을 설정하는 것이 옳지 만 정적 공백 이미지 인 비트 맵과 동일한 null 값으로 설정해야합니다. 내가 사용

nullImage은 다음과 같이 클래스의 앞부분에 정의되어
e.Value = (imageIndex != int.MinValue) ? imageList.Images[imageIndex] : nullImage; 

:

private readonly Image nullImage = new Bitmap(1, 1); 
1

해결책을 찾았지만 이것이 최선의 방법인지는 잘 모르겠습니다.

RowsAdded 이벤트를 재정의하고 DataGridViewImageColumn의 Value를 null로 설정합니다. 나는 값이 null이기 때문에 이미지를 표시한다고 생각한다.

private void dgvWorksheet_RowsAdded(object sender, 
    DataGridViewRowsAddedEventArgs e) 
{ 
    dgvWorksheet.Rows[e.RowIndex].Cells[colStartClock.Index].Value = null; 
} 

나는 또한 내가 할 필요가 무엇이 있는지 확실하지 해요의 Form_Load

colStartClock.DefaultCellStyle.NullValue = null; 

에 null로 열의에 nullValue를 설정합니다. 작동하는 것처럼 보이지만 약간 버그가있는 것 같습니다. 무작위로 클릭하면 예외가 발생하기 때문에 더 많은 조사가 필요합니다.

2

내가이 솔루션을 통해 보면서 내가 일이있어 방법은 생성자에서 InitializeComponent() 호출 후에이 작업을 수행하는 것이 었습니다 데이터 바인딩 된 행에 대한 빈 이미지

dataGridView1.Columns[0].DefaultCellStyle.NullValue = null; 

를 기본 이미지를 만들 그리고 마지막에 빈 행에 빨간색 X를 제거 RowPrePaintEvent 걸리지 그리드의 AllowUserToAddRows = true 이유는 numberOfRows는 그리드의 유효한 행의 수는

private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e) 
{ 
     if (e.RowIndex >= numberOfRows) 
     { 
      dataGridView1.Rows[e.RowIndex].Cells[0].Value = null; 
     } 
} 

. 이 문제를 처리하는 데 단지 몇 시간을 보냈습니다. 내가 DataGridView에있는 모든 DataGridViewImageColumn 요소에 대한이 기본 동작을 방지하기 위해이

private void dgUserFileList_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e) { 
     DataGridViewRow row = dgUserFileList.Rows[e.RowIndex]; 
     if (row.IsNewRow) { 
      row.Cells[0].Value = null; 
     } 
     } 
    } 
2

...이 다른 사람에게 두통을 절약 희망은을 차단하는 것입니다 CellFormatting 이벤트 : 구성 요소가 항상 대신 기본 "사용할 수없는 이미지"의 셀의에 nullValue 이미지를 사용합니다

dataGridView1.CellFormatting += delegate(object sender, DataGridViewCellFormattingEventArgs e) 
{ 
    if (e.RowIndex < 0 || e.ColumnIndex < 0) 
     return; 

    var grid = (DataGridView)sender; 
    if (grid.Columns[e.ColumnIndex] is DataGridViewImageColumn && 
     grid[e.ColumnIndex, e.RowIndex].DefaultNewRowValue.Equals(e.Value)) 
     e.Value = null; 
}; 

이 방법.

0

또 다른 방법은 같은 위해 Grid.Row의 IsNewRow 속성을 사용

1

MSDN documentation이에 다소 장황 : 기본적으로

는, 빈 셀은 기본 오류 그래픽을 표시합니다. 또는 DBNull.Value 동일 셀 값 나타나지 이 그래픽을 방지하기 위해, 제어부에 행을 추가하기 전에 널 DefaultCellStyle 속성에 의해 반환 셀 스타일 객체의 DataGridViewCellStyle.NullValue 속성을 설정. 그러나 이것은 새로운 레코드 인 행에 영향을주지 않습니다. 제어 AllowUserToAddRows 특성 값이 사실 때 새로운 기록을 위해 에 행을 나타나는 오류 그래픽을 방지하기 위해, 당신은 또한 명시 적으로 제어 RowsAdded 이벤트에 대한 핸들러에서 에 셀 값을 설정하거나 설정해야합니다 를 반환하는 오버라이드 (override) DefaultNewRowValue 특성을 가진 DataGridViewImageCell 유도 된 유형의 인스턴스에 열 CellTemplate 속성입니다.

당신이 어떤 행을 추가하기 전에이 작업을 수행 할 수 있음을 의미 코딩 번역 :

var column = new DataGridViewImageColumn(); 
column.DefaultCellStyle.NullValue = null; 
column.CellTemplate = new DataGridViewEmptyImageCell(); 

을 그리고 곳이 클래스를 넣어 :

private class DataGridViewEmptyImageCell : DataGridViewImageCell 
{ 
    public override object DefaultNewRowValue { get { return null; } } 
} 

또는 설정 Cell.Value를 null로에 Rows.Added 이벤트.

+0

그것은 나를 위해 작동합니다. 감사! – camino

관련 문제