2010-12-22 8 views
0

로그 양식을 만들고 DGV에 정보를 표시하고 있습니다. 각 로그는 LogEntry 클래스의 형태로 제공됩니다.포커스가 있지 않으면 색상이 DataGridview 행에 적용되지 않습니다.

는 원래 내가 만든 그래서 같은 DGV에 데이터를 추가 :

지금처럼 DGV의 각 coloumn 만들기 :

DataGridViewTextBoxColumn dateTimeColumn = new DataGridViewTextBoxColumn(); 
dateTimeColumn.Name = "dateTime"; 
dateTimeColumn.HeaderText = "Date/Time"; 
dataGridView_Log.Columns.Add(dateTimeColumn); 

logEntry 기록 추가 : 모든

dataGridView_Log.Rows.Add(logEntry.dateTime, logEntry.service, logEntry.command, logEntry.message); 
dataGridView_Log.Rows[dataGridView_Log.Rows.Count - 1].DefaultCellStyle.ForeColor = logEntry.color; 

이를 잘 작동하고 각 행의 색상이 오른쪽 색깔이지만 로그 그것은 내가 그것을 의지대로 그것을 필터링 할 수 있도록하고 싶습니다 많은 항목을 보유하고 있습니다. 주변에보고 한 후

내가했던 방법을 사용하여 필터를 기운 것 같다 그래서 난이 방법으로 다시 복귀 (난 그냥 올바른 예를 발견 havent 한 할 수있을 것입니까?) :

추가 열 :

//Create a new DataTable 
    dt = new DataTable("Logs"); 

    //Add columns to datatable 
    dt.Columns.Add("dateTime", typeof(string)); 
    dt.Columns.Add("Service", typeof(string)); 
    dt.Columns.Add("Command", typeof(string)); 
    dt.Columns.Add("Message", typeof(string)); 

    //Set the dataGridView's dataSoure to the filled dataTable 
    dataGridView_Log.DataSource = dt; 

추가 행 다음 DGV 나던 행의 적용 밤은 색상에 초점을 가지고 있고 그냥 검은 색 텍스트 그러나 여기

row = dt.NewRow(); 

    row["dateTime"] = logEntry.dateTime; 
    row["Service"] = logEntry.service; 
    row["Command"] = logEntry.command; 
    row["Message"] = logEntry.message; 

    dt.Rows.Add(row); 

    dataGridView_Log.Rows[dataGridView_Log.Rows.Count - 1].DefaultCellStyle.ForeColor = logEntry.color; 

는 문제입니다. 그러나 DGV가 포커스를 얻 자마자 추가되는 모든 행이 컬러로 표시됩니다.

다른 메모는 한 번 필터링됩니다. 색상이 여전히 올바른 행에 적용되기를 원합니다.

내가 원하는 건 반짝 색상 :

당신의 시간과 도움을 주셔서 감사합니다.

답변

0

내가 살아야 그것을 해결 생각 :

dt.Columns.Add("Color", typeof(Color)); 

다음으로 데이터 소스를 할당 한 후

dataGridView_Log.Columns["Color"].Visible = false; 

각 행을 작성 :

row["Color"] = logEntry.color; 

이 cellformating 이벤트를 추가 : 필터링 aswell :

0

격자에서 항목을 선택할 때까지 색상이 새로 고침되지 않는 이유가 확실하지 않습니다. 색상을 설정 한 후 .Refresh() 또는 .Update()으로 전화를 시도 했습니까?

흥미로운 MSDN에서이 링크에서 약 DataGridView 스타일을 읽을 : (DataTable을 만들 때)

내가 추가 ...

http://msdn.microsoft.com/en-us/library/1yef90x0.aspx

+0

미안 내가 말할 색상을 저장하는

재산권 :

내가 속성의 각 값에 대해 색상을 포함하는 목록을 사용하여 문제를 해결 초점을 맞추면 나는 DGV가 '보일'수 있다는 것을 의미했다. DGV는 처음에 인스턴스화 된 별도의 양식에 있으며, 사용자가 버튼을 클릭하면 닫히는 양식도 덮어 쓰여지고 닫히지 않고 숨겨집니다. 일단 form이 처음 form.show()가되면 색상이 적용됩니다. – Metalstorm

1

private void dataGridView_Log_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
    { 
     dataGridView_Log.Rows[e.RowIndex].DefaultCellStyle.ForeColor = (Color)dataGridView_Log.Rows[e.RowIndex].Cells["Color"].Value; 
    } 

작품을 나는 비슷한 문제가 있었다.

내 DataGridView 데이터 소스는 많은 개체가 "블록"속성에서 동일한 값을 가질 수있는 개체 목록입니다. "블록"을 기반으로 색상을 적용하려고했습니다.

private Dictionary<Block, Color> m_BlockColors = new Dictionary<Block, Color>(); 

코드 :

DataGridViewCell blockCell = null; 
if (dataGridView.Columns.Contains(columnNameBlock)) 
{ 
    blockCell = dataGridView[columnNameBlock, e.RowIndex]; 
} 
if (blockCell != null) 
{ 
    if (blockCell.Value == null) 
    { 
     e.CellStyle.BackColor = Color.Red; 
    } 
    else 
    { 
     Block blockOfCurrentRow = (Block)blockCell.Value; 
     Block blockOfRowBefore = null; 

     // Wont hit at first Row! 
     if (e.RowIndex > 0) 
     { 
      blockOfRowBefore = (Block)dataGridView[columnNameBlock, e.RowIndex - 1].Value; 
     } 

     if (blockOfRowBefore != null) 
     { 
      //Trace.WriteLine("------------------------------------------------------"); 
      //Trace.WriteLine(String.Format("RowIndex: {0}", e.RowIndex)); 
      //Trace.WriteLine(String.Format("ColumnIndex: {0}", e.ColumnIndex)); 
      //Trace.WriteLine(String.Format("Current Block: {0}", blockOfCurrentRow.BlockNummer)); 
      //Trace.WriteLine(String.Format("Prev Block: {0}", blockOfRowBefore.BlockNummer)); 

      if (blockOfCurrentRow == blockOfRowBefore) 
      { 
       e.CellStyle.BackColor = m_BlockColors[blockOfCurrentRow]; 
      } 
      else 
      { 
       // Previous Row was gray: 
       if (m_BlockColors[blockOfRowBefore] == Color.LightGray) 
       { 
        if (!m_BlockColors.ContainsKey(blockOfCurrentRow)) 
        { 
         m_BlockColors.Add(blockOfCurrentRow, Color.White); 
        } 
       } 
       // Previous Row was white: 
       else 
       { 
        if (!m_BlockColors.ContainsKey(blockOfCurrentRow)) 
        { 
         m_BlockColors.Add(blockOfCurrentRow, Color.LightGray); 
        } 
       } 
       e.CellStyle.BackColor = m_BlockColors[blockOfCurrentRow]; 
      } 
     } 
     else 
     { 
      // first Row 
      if (!m_BlockColors.ContainsKey(blockOfCurrentRow)) 
      { 
       m_BlockColors.Add(blockOfCurrentRow, Color.White); 
      } 
      e.CellStyle.BackColor = m_BlockColors[blockOfCurrentRow]; 
     } 
    } 
} 
관련 문제