2016-12-09 79 views
0

此應用程序是一種留言板類型的應用程序。您發佈消息,該消息存儲在Oracle數據庫中。用戶的照片,姓名,日期和消息以列表視圖顯示。一切正常,但字體顏色變化的功能請求進來了。現在測試下面的東西,我知道我可以顯示所有的消息作爲一種特定的顏色。列表查看每個項目的ForeColor

我要做的是給我的表添加一個「顏色」列。然後,如果用戶選擇他們的消息文本爲「紅色」,例如,我將在該帖子的表格的顏色列中存儲紅色的十六進制顏色。

所以我試圖弄清楚什麼時候該消息被檢索到,我如何設置這個代碼爲'如果顏色列爲空,發送消息爲黑色,否則如果每個消息發佈了特定消息的十六進制顏色在那種顏色下'沒有改變每個消息的顏色爲紅色,如下面的代碼所做的那樣。

 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);

然後我需要幫助調整我的查詢,添加顏色,一旦顏色添加到顏色列。這是代碼。

如果數據庫管理員添加了MESSAGE_COLOR varchar列。

我發帖時編輯此下方現有的代碼,爲新創建的列MESSAGE_COLOR ..

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; 
     } 
    } 

我然後編輯DB讀瓦特/新列也是如此。

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

我已經得到了一切編碼,我現在提交的顏色數據庫。但是,在每個帖子下方顯示列表視圖時,仍然只有默認的黑色文本顏色。而不是保存爲例如「#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'也不成問題。通過十六進制是一種選擇,但沒有什麼意義,除非有人真的可以閱讀/理解/編輯它們。 – TaW

+0

發佈人永遠不會看到十六進制。問題不在於檢索顏色,而是超過1個。因此,如果20個人發佈可能具有20種不同顏色的消息。按照我的例子,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

您可以將十六進制值轉換(假定該存儲格式"#RRGGBB"字符串)使用ColorTranslator
使用這種方法成一種顏色,你還可以使用命名的顏色(如"Violet"

Message.SubItems.Add(m.MessageText + Environment.NewLine).ForeColor = 
    System.Drawing.ColorTranslator.FromHtml(m.Color); //sth. like "#FFCC66" 

此外,您必須檢索Color列的值。看來你必須添加"MESSAGE_COLOR"(或任何你的專欄稱爲)db_columns。當你從數據庫中的值,你必須將列映射到您Message的財產:

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

(換句話說:你已經保存到數據庫,現在您還可以從數據庫讀取它)

+0

我知道我可以拉出顏色並進行轉換。沒關係。我只是沒有添加,因爲我的問題仍然存在。一旦我檢索到十六進制顏色保存,並像我在示例中那樣應用它,它將影響每個人的信息的顏色。我試圖弄清楚如何單獨應用它。因此,如果Bob發佈帶有藍色文本的消息,並且Tim用紅色文本發佈消息,則在listview中顯示的每個人員帖子都是他們發佈的顏色。 – Lee

+0

好的。你能否把這個添加到你的問題中,因爲我不清楚這個問題。 :) –

+0

我添加了它,但它聲明「我知道我可以用一種顏色發佈所有消息」,並以「無需將每個消息的顏色更改爲紅色,就像下面的代碼所做的那樣」結束。 – Lee