2014-09-30 37 views
6

Jeśli określisz AllowUserToAddRows w winformach DataGridView użytkownik może ręcznie dodać nowe wiersze w siatce. Teraz chcę dodać przycisk obrazu w jednej kolumnie, który powinien zostać wyświetlony również w nowym wierszu. Ale nie mogę zrobić tego, aby pokazać obraz, tylko obraz czerwono-krzyżowy jest pokazany tak, jakby nie został znaleziony.Zamień "czerwony krzyż" w DataGridViewImageColumn na "nowy wiersz" z niestandardowym obrazem

Oto zrzut ekranu z siatki z irytującego obrazu:

enter image description here

Obraz chcę pokazać to w Properties.Resources.Assign_OneToMany.

Szukałem wszędzie i próbowałem kilka sposobów, takich jak (w konstruktorze)

var assignChargeColumn = (DataGridViewImageColumn)this.GrdChargeArrivalPart.Columns["AssignCharge"]; 
assignChargeColumn.DefaultCellStyle.NullValue = null; 
assignChargeColumn.DefaultCellStyle.NullValue = Properties.Resources.Assign_OneToMany; 

lub

private void GrdChargeArrivalPart_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e) 
{ 
    var grid = (DataGridView)sender; 
    DataGridViewRow row = grid.Rows[e.RowIndex]; 
    if (row.IsNewRow) 
    { 
     var imageCell = (DataGridViewImageCell) row.Cells["AssignCharge"]; 
     imageCell.Value = new Bitmap(1, 1); // or ...: 
     imageCell.Value = Properties.Resources.Assign_OneToMany; // or ...: 
     imageCell.Value = null; 
    } 
} 

oczywiście również przypisany ten obraz w kolumnie kolekcji DataGridView na projektant:

enter image description here

Jaki jest więc właściwy sposób określenia domyślnego obrazu dla DataGridViewImageColumn, który jest wyświetlany, nawet jeśli nie ma danych, ale tylko nowy wiersz? Jeśli to się liczy, jest to jpg-image: enter image description here

+0

Co masz na myśli * nowy wiersz *? Ktoś dodaje nowy wiersz. Następnie dodaje kolejną. Który jest nowym rzędem. Obecny lub oba (bieżący i poprzedni)? –

+0

@ γηράσκωδ'αείπολλάδιδασκόμε: 'DataGridViewRow', który jest dodawany automatycznie, jeśli' AllowUserToAddRows' ustawiono na 'true'. Jest to jedyny wiersz, który zwraca 'true' dla [' IsNewRow'] (http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridviewrow.isnewrow (v = vs.110) .aspx) (link inside, from MSDN: _ "wiersz przestaje być nowym wierszem, gdy rozpoczyna się wprowadzanie danych do wiersza." _). Użytkownik powinien mieć możliwość wstawiania rekordów, podając wszystkie wartości bezpośrednio w 'DataGridView'. Więc w zasadzie ten wiersz zastępuje formularz. –

Odpowiedz

5

Można działać w przypadku CellFormatting:

private void dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
{ 
    // ToDo: insert your own column index magic number 
    if (this.dgv.Rows[e.RowIndex].IsNewRow && e.ColumnIndex == 2) 
    { 
     e.Value = Properties.Resources.Assign_OneToMany; 
    } 

} 

enter image description here

Uważam, że ignorowanie przypisania właściwości Obraz w edytorze kolumn, ponieważ to wiersz to Nothing/Null na początek.

+1

Wow, to już działa. Pozwól mi rzucić okiem na drugą odpowiedź. Z góry dziękuję! –

2

Narysuj obraz ręcznie, ponieważ system zwraca domyślną:

private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) 
    { 
     if (e.ColumnIndex == 3 && e.RowIndex >= 0) //change 3 with your collumn index 
     { 
      e.Paint(e.CellBounds, DataGridViewPaintParts.All); 

      if (dataGridView1 .Rows [e.RowIndex].IsNewRow) 
      { 
       Bitmap bmp = Properties.Resources.myImage; 

       e.Graphics.DrawImage(bmp, e.CellBounds.Left + e.CellBounds.Width/2 - 
       bmp.Width/2, e.CellBounds.Top + e.CellBounds.Height/2 - 
       bmp.Height/2, bmp.Width, bmp.Height); 
      } 

      e.Handled = true; 
     } 
    } 
+0

To nigdy nie wchodzi w wewnętrzne 'if', które sprawdza' IsNewRow'. Nie lubię też rysować obrazów ręcznie. Jednak bardzo dziękuję za twoje wysiłki (+1). –