このアプリケーションはメッセージボードタイプのアプリです。 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;
を変更することでしたが判明。
どのように保存された色にアクセスしますか?もしそれが 'int'であれば' .ForeColor = Color.FromArgb(yourIntValue) 'と書くことができます。また、DBMSからのデフォルト値' 0'での読み込みも問題ではありません。ヘックスで行くことはオプションですが、誰かが実際にそれらを読んだり理解したり編集したりすることができない限りほとんど意味がありません。 – TaW
投稿者は決してヘクスを見ません。問題は、色を取り戻すことではなく、1以上です.20人が潜在的に20色のメッセージを投稿した場合。私の例では、リストビューはすべてのメッセージを設定された色にポストします。私は色を付けられた人に基づいて、listviewの各メッセージを、上記のようなすべてのメッセージではなく個々の色で表示する方法を理解しようとしています。 – Lee
いいえ、各[ListViewItem](https://msdn.microsoft.com/en-us/library/system.windows.forms.listviewitem%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396)フォアグラウンドとバックグラウンドの両方に独自の色があります。あなたがメッセージと共に色を保存するなら、うまくいくでしょう。 – TaW