2016-12-09 4 views
0

Это приложение представляет собой тип приложения для сообщений. Вы отправляете сообщение, которое хранится в базе данных Oracle. Фотография пользователя, имя, дата и сообщение пользователя отображаются в виде списка. Однако все работает, но появился запрос функции для изменения цвета шрифта. Теперь, проверяя вещи ниже, я знаю, что могу отображать ВСЕ сообщения в виде определенного цвета.Listview 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 выбирают другой цвет для размещения своего сообщения. Таким образом, в БД все 20 строк имеют разный цвет в столбце БД, мне нужно, чтобы эти сообщения отображались в виде списка отдельно в зависимости от цвета, который они размещен как. В настоящее время я знаю только о применении одного цвета ко всем сообщениям в списке, как показано в моем примере выше.

Похоже, благодаря Стефан, когда я добавить

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

тогда мне нужно помочь регулировать мой запрос, чтобы добавить цвет, как только цвета добавляются к колонке цвета. Вот этот код.

Администратор базы данных DB добавляет столбец 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; 
    } 

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

Окончательное обновление

Оказывается, последний кусок я не хватало, чтобы изменить свойство ListView UseItemStyleForSubItems = false; в настоящее время его работы.

+0

Как вы можете получить доступ к сохраненному цвету? если это 'int', вы можете просто написать' .ForeColor = Color.FromArgb (yourIntValue) '.. И чтение в значение по умолчанию' 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

Я знаю, что могу потянуть цвет и преобразовать. Хорошо. Я просто не добавил, что моя проблема все еще будет существовать. Как только я получаю сохранение цвета в шестнадцатеричном формате и применяю его, как в моем примере, это повлияет на цвет сообщения каждого. Я пытаюсь понять, как применять его индивидуально. Поэтому, если Боб опубликует сообщение с синим текстом, а Тим опубликует сообщение с красным текстом, каждое сообщение с людьми, отображаемое в списке, это цвет, который они разместили в виде. – Lee

+0

А, ок. Не могли бы вы добавить это на свой вопрос, потому что imho это было не совсем ясно. :) –

+0

Я добавил его, но в нем говорится: «Я знаю, что могу публиковать ВСЕ сообщения в одном цвете» и заканчивается «Без изменения цвета каждого сообщения на красный, как в приведенном ниже коде». – Lee

Смежные вопросы