2016-12-09 4 views
0

이 응용 프로그램은 응용 프로그램의 메시지 보드 유형입니다. Oracle 데이터베이스에 저장된 메시지를 게시합니다. 사용자의 사진, 이름, 날짜 및 메시지가 목록보기에 표시됩니다. 그러나 글꼴 색상 변경에 대한 기능 요청이 모두 들어 왔습니다. 아래의 항목을 테스트하면 모든 메시지를 특정 색상으로 표시 할 수 있습니다.목록보기 항목 별 ForeColor

내가 할 일은 테이블에 '색상'열을 추가하는 것입니다. 그런 다음 사용자가 메시지의 텍스트를 '빨간색'으로 선택하면 해당 게시물의 표의 색상 열에 빨간색의 16 진수 색상을 저장하게됩니다.

그래서 내가 알아 내려고하는 것은 메시지를 가져올 때 '이 색을 빈칸으로 채우면 검은 색으로 메시지를 게시 할 수 있습니다. 아래의 코드 에서처럼 모든 메시지의 색상을 빨간색으로 변경하지 않고 해당 색상으로 표시합니다.

 List<MsgBoard> Messages = MsgBoard.find_ActiveByBoardName(Convert.ToString(cmbgroup.SelectedItem)); 
     int i = 0; 
     imageList1.Images.Clear(); 

     foreach (MsgBoard m in Messages) 
     { 
      AddImages(m.EmpPic); 

      ListViewItem Message = new ListViewItem("", i); 
      if (m.AlertNo == 0) //Default Message Post (non Alert) 
      { 
       Message.UseItemStyleForSubItems = false; 
       Message.SubItems.Add(m.EmpName.First); 
       Message.SubItems.Add(m.MessageText + Environment.NewLine).ForeColor = Color.Red; 
       Message.SubItems.Add(m.PostDate.ToString()); 
       Message.SubItems.Add(m.EmpName.EmpNo.ToString()); 
       Message.SubItems.Add(m.EmpName.Name); 
       listView1.Items.Add(Message);     
      } 
      i++; 
     } 
    } 

그냥 정리해보십시오. 20 명이 메시지를 게시하고 20 명이 서로 다른 색을 선택하여 메시지를 게시하면 DB 열 모두 20 열 모두 DB 열에서 다른 색을 갖게됩니다. 이러한 메시지는 색을 기준으로 개별적으로 listview에 표시해야합니다. 로 게시했습니다. 나는 현재 위의 예제에서와 같이 listview의 모든 메시지에 단 하나의 색상을 적용하는 것을 알고 있습니다. 나는 다음 색상이 색상 컬럼에 추가되면 색상을 추가 내 쿼리를 조정하는 데 도움이 필요

Message.SubItems.Add(m.MessageText + Environment.NewLine).ForeColor = System.Drawing.ColorTranslator.FromHtml(m.Color);

를 추가하면

는 스테판에게 감사 같은데. 여기에 그 코드가 있습니다.

가드 DB 관리자가 MESSAGE_COLOR varchar 열을 추가했습니다. 게시 할 때

나는 다음 DB뿐만 아니라 새 열/w를 읽고 편집이

public string Create() 
    { 
     try 
     { 
      OleDbDataReader result = Database.Conn.Execute(
       "INSERT INTO MPCS.MEYER_BOARD (" + 
       "EMPLOYEE_ID, " + 
       "POST_DATE, " + 
       "BOARD_NAME," + 
       "ALERT_NO," + 
       "MESSAGE_TEXT," + 
       "MESSAGE_COLOR," + 
       "ACTIVE_FLAG" + 
       ") VALUES (?,SYSDATE,?,?,?,?)", 
       new List<OleDbParameter> { 
        new OleDbParameter("EMPLOYEE_ID",EmpName.EmpNo), 
        new OleDbParameter("BOARD_NAME",BoardName), 
        new OleDbParameter("ALERT_NO",AlertNo), 
        new OleDbParameter("MESSAGE_TEXT",MessageText), 
        new OleDbParameter("MESSAGE_COLOR",MessageColor), 
        new OleDbParameter("ACTIVE_FLAG",ActiveFlag ? "Y" : "N") 
        }, Query.ReaderType.Reader); 
      result.Read(); 
      result.Close(); 
      return null; 
     } 
     catch (Exception ex) 
     { 
      return ex.Message; 
     } 
    } 

.. 새로 만든 열 MESSAGE_COLOR를 들어, 기존의 코드에 아래이를 편집 할 수 있습니다.

public static MsgBoard DBRead(OleDbDataReader result,string alias=null) 
    { 
     return new MsgBoard 
     { 
      EmpName = Employee.DBRead(result, "EMPLOYEE"), 
      MessageText = result[alias + "MESSAGE_TEXT"].ToString(), 
      MessageColor = result[alias + "MESSAGE_COLOR"].ToString(), 
      BoardName = result[alias +"BOARD_NAME"].ToString(), 
      AlertNo = (int)(decimal)result[alias +"ALERT_NO"], 
      PostDate = (DateTime)result[alias +"POST_DATE"], 
      ActiveFlag = result[alias +"ACTIVE_FLAG"].ToString().ToString() == "Y", 
      EmpPic = ImageResource.DBRead(result, "IR") 
     }; 
    } 

하지만 내 build_query를 편집해야합니까?

public static String build_query(String where, string OrderBy = null) 
    { 
     List<String> cols = new List<String>(); 
     cols.AddRange(db_columns.ConvertAll(c => "MPCS.MEYER_BOARD." + c + " AS MBOARD_" + c)); 
     cols.AddRange(Employee.db_columns.ConvertAll(c => "MPCS.EMPLOYEE." + c + " AS EMPLOYEE_" + c)); 
     cols.AddRange(ImageResource.db_columns.ConvertAll(c => "MPCS.IMAGE_RESOURCE." + c + " AS IR_" + c)); 
     String sql = 
      "SELECT " + String.Join(", ", cols) + " " + 
      "FROM MPCS.MEYER_BOARD " + 
      "LEFT OUTER JOIN MPCS.EMPLOYEE " + 
      "ON MPCS.MEYER_BOARD.EMPLOYEE_ID=MPCS.EMPLOYEE.EMPLOYEE_ID " + 
      "LEFT OUTER JOIN MPCS.IMAGE_RESOURCE " + 
      "ON MPCS.IMAGE_RESOURCE.IR_ID=MPCS.EMPLOYEE.IMAGE_RESOURCE_ID " + 
     "WHERE "; 
     sql += where; 
     sql += OrderBy; 
     return sql; 
    } 

UPDATE

내가받은 모든 코딩 봤는데, 지금은 DB에 색상을 제출하고있다. 그러나 각 게시물 아래 목록보기를 표시 할 때 여전히 기본 검정 텍스트 색이 있습니다. 예를 들어 "# FFF000"으로 변환되어 표시되는 색상 대신 저장됩니다.

foreach (MsgBoard m in Messages) 
     { 
      AddImages(m.EmpPic); 

      ListViewItem Message = new ListViewItem("", i); 
      if (m.AlertNo == 0) //Default Message Post (non Alert) 
      { 
       Message.SubItems.Add(m.EmpName.First);     
       Message.SubItems.Add(m.MessageText + Environment.NewLine).ForeColor = System.Drawing.ColorTranslator.FromHtml(m.MessageColor); 
       Message.SubItems.Add(m.PostDate.ToString()); 
       Message.SubItems.Add(m.EmpName.EmpNo.ToString()); 
       Message.SubItems.Add(m.EmpName.Name); //Displayed only on 'Show Details' 
       listView1.Items.Add(Message); 
      } 

최종 갱신

내가 실종 된 마지막 조각이 이제 작업을 목록보기 속성 UseItemStyleForSubItems = false;을 변경했다 밝혀졌습니다.

+0

그래서 저장된 색상에 어떻게 액세스합니까? 그것이'int' 인 경우'.ForeColor = Color.FromArgb (yourIntValue)'를 쓸 수 있습니다. 그리고 DBMS에서 기본값 '0'으로 읽는 것도 문제가 아닙니다. 16 진수를 거치는 것은 옵션이지만 누군가 실제로 읽거나 이해/편집 할 수 없으면 거의 이해가되지 않습니다. – TaW

+0

게시자는 헥스를 보지 않습니다. 문제는 색을 되 찾는 것이 아니라 1을 넘는 것입니다. 따라서 20 명의 사람들이 잠재적으로 20 가지 색상의 메시지를 게시합니다. 내 예제에 따라 listview는 모든 메시지를 설정된 색상으로 게시합니다. 색상을 게시 한 사람을 기준으로 listview의 각 메시지를 위와 같은 모든 메시지가 아닌 개별 색으로 표시하는 방법을 알아 내려고합니다. – Lee

+0

아니요, 각 [ListViewItem] (https://msdn.microsoft.com/en-us/library/system.windows.forms.listviewitem%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396) 전경색과 배경색 모두 고유 한 색상을 유지해야합니다. 메시지와 함께 색상을 저장하면 정상적으로 작동합니다. – TaW

답변

1

당신은 당신의 16 진수 값을 변환 할 수 있습니다 ("Violet" 같은)

Message.SubItems.Add(m.MessageText + Environment.NewLine).ForeColor = 
    System.Drawing.ColorTranslator.FromHtml(m.Color); //sth. like "#FFCC66" 
라는 이름의 색상을 사용 또한,이 방법을 사용 ColorTranslator
을 사용하여 색상에 있습니다 (이 형식 "#RRGGBB"의 문자열로 저장되어 있다고 가정)

또한 Color 열의 값을 검색해야합니다. 귀하의 db_columns"MESSAGE_COLOR" (또는 귀하의 열이 무엇이든간에)을 추가해야합니다. 당신은 DB에서 값을 얻을 때, 당신은 당신의 Message의 속성에 열을 매핑해야합니다 :

return new MsgBoard 
{ 
    // ... 
    Color = System.Drawing.ColorTranslator.FromHtml([alias+"MESSAGE_COLOR"]), 
    // ... 
} 

(즉 : 당신은 이미 지금 당신은 또한 DB에서 읽어해야 dB로 저장)

+0

나는 색깔을 가져 와서 변환 할 수 있다는 것을 안다. 괜찮아. 내 문제가 여전히 존재하기 때문에 나는 그것을 추가하지 않았습니다. 일단 16 진수 색상 저장을 검색하고 예제에서와 같이 적용하면 모든 사람의 메시지 색상에 영향을 미칩니다. 나는 그것을 개별적으로 적용하는 방법을 찾으려하고있다. 따라서 Bob이 메시지를 청색 텍스트로 게시하고 Tim이 빨간색 텍스트로 메시지를 게시하면 listview에 표시된 각 개인 게시물은 자신이 게시 한 색상입니다. – Lee

+0

아 좋아. imho가 정말로 분명하지 않았기 때문에이 질문을이 질문에 추가하십시오. :) –

+0

나는 그것을 추가했으나 "모든 메시지를 한 색상으로 게시 할 수 있음을 알고 있습니다"라는 말로 끝나며 "현재 아래 코드와 같이 모든 메시지의 색을 빨간색으로 변경하지 않고"로 끝납니다. – Lee