簡體   English   中英

每個項目的Listview前景色

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM