2016-12-09 4 views
0

このアプリケーションはメッセージボードタイプのアプリです。 Oracleデータベースに格納されているメッセージを送信します。ユーザーの写真、名前、日付、メッセージがリストビューに表示されます。しかし、すべてが機能しますが、フォントの色の変更が要求されました。以下のテストでは、すべてのメッセージを特定の色で表示できます。Listview ForeColor per item

私はテーブルに「カラー」列を追加します。次に、ユーザーがメッセージのテキストを「赤」に選択した場合、そのポストの表の色の列に赤の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人すべてが自分のメッセージを投稿するために別の色を選択した場合、20列すべてがDB列に異なる色を表示するので、それらのメッセージをlistviewに個別に表示する必要がありますとして掲示される。私は現在、上記の例に示すように、listviewのすべてのメッセージに単一の色を適用することを認識しています。私はその後、色が色の欄に追加されると色を追加するために、私のクエリを調整する助けが必要

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

を追加すると

は、ステファンのおかげのように見えます。ここにそのコードがあります。

DB管理者がMESSAGE_COLOR varchar列を追加していました。

..

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が同様に新しい列/ wを読んで編集し、新しく作成された列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'での読み込みも問題ではありません。ヘックスで行くことはオプションですが、誰かが実際にそれらを読んだり理解したり編集したりすることができない限りほとんど意味がありません。 – 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

あなたが進値を変換することができます("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

ああ。これは本当に明確ではなかったので、あなたの質問にこれを加えてください。 :) –

+0

私はそれを追加しましたが、 "私はすべてのメッセージを1つの色で投稿できます"と終了します。 "現在のコードと同じように、すべてのメッセージの色を赤色に変更せずに終了します。 – Lee

関連する問題