[英]Listview ForeColor per item
此應用程序是留言板類型的應用程序。 您發布一條消息,該消息存儲在Oracle數據庫中。 用戶的照片,姓名,日期和消息顯示在列表視圖中。 一切正常,但是提出了更改字體顏色的功能請求。現在測試下面的內容,我知道我可以將所有消息顯示為特定顏色。
我要做的是在表格中添加“顏色”列。 然后,例如,如果用戶選擇其郵件的文本為“紅色”,我將在該帖子的表格顏色欄中存儲紅色的十六進制顏色。
因此,我想弄清楚的是何時檢索到該消息,如何將代碼設置為“如果顏色列為空,則將消息發布為黑色,否則如果每個消息都存在十六進制顏色,則以該顏色發布該特定消息”無需像下面的代碼那樣將每條消息的顏色更改為紅色。
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列中都具有不同的顏色,我需要根據他們的顏色在列表視圖中分別顯示這些消息發布為。 我目前僅知道將一種顏色應用於列表視圖中的所有消息,如上面的示例所示。
貌似要感謝斯蒂芬,一旦我添加
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;
}
}
然后,我也編輯帶有新列的數據庫。
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;
}
更新
我已經完成了所有編碼,現在將顏色提交給數據庫。 但是,當在下面顯示列表視圖時,每個帖子仍然只有默認的黑色文本顏色。 而不是轉換並顯示例如保存為“#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);
}
最終更新
原來我缺少的最后一塊是更改listview屬性UseItemStyleForSubItems = false;
現在它的工作。
您可以使用ColorTranslator
將十六進制值(假設它以字符串形式以"#RRGGBB"
的形式存儲)轉換為顏色
使用這種方法,您還可以使用命名的顏色(例如"Violet"
)
Message.SubItems.Add(m.MessageText + Environment.NewLine).ForeColor =
System.Drawing.ColorTranslator.FromHtml(m.Color); //sth. like "#FFCC66"
此外,您必須檢索“ Color
列的值。 看來您必須在db_columns
添加"MESSAGE_COLOR"
(或任何您調用列的內容)。 從數據庫獲取值時,必須將列映射到Message
的屬性:
return new MsgBoard
{
// ...
Color = System.Drawing.ColorTranslator.FromHtml([alias+"MESSAGE_COLOR"]),
// ...
}
(換句話說:您已經將其保存到數據庫,現在還必須從數據庫讀取它)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.