Изменить размер шрифта, если текст не помещается в ячейку (XRTable)

Как изменить размер содержимого ячейки (размер шрифта), если он не подходит. Я не хочу переносить слова или изменять размер ячейки, так как форма должна умещаться на одной странице. Текст может иметь различную длину. Может содержать пробелы, но не обязательно.

@редактировать

Я сделал ошибку. Контроль, который я имел в виду, не XtraGrid но XRTable,

2 ответа

Я предлагаю вам сначала взглянуть на явления. Есть несколько способов настроить внешний вид отдельных строк и ячеек.

Если эти параметры бесполезны, вы можете вручную нарисовать содержимое ячейки так, как вам нужно, используя функцию Custom Drawing. Например, вы можете использовать событие GridView.CustomDrawCell, чтобы проверить, превышает ли содержимое ячейки границы ячейки, и соответственно обновить шрифт этой ячейки.

Пример по теме: Практическое руководство. Пользовательские элементы рисования в зависимости от значений ячеек

Вы можете изменить шрифт ячейки, где текст течет следующим образом

private void gvView_CustomDrawCell(object sender, DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs e)
    {
      if (e.Column != null && e.Column.Name == bgcStav.Name)
      {
        float minFontSize = 6;
        string text = "teeeeeeeeeeeeeext";
        int minWidth = gvView.CalcColumnBestWidth(bgcStav);        
        SizeF s = e.Appearance.CalcTextSize(e.Graphics, text, minWidth);
        if (s.Width >= minWidth)
        {
          e.Appearance.Font = new Font(e.Appearance.Font.FontFamily, minFontSize);          
        }
      }
    }

но гораздо лучше обрезать текст, если он переполнен (вы не знаете, как долго текст может быть), когда вы не хотите использовать перенос слов

 private void gvView_CustomDrawCell(object sender, DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs e)
    {
      if (e.Column != null && e.Column.Name == bgcStav.Name)
      {
        string text = e.DisplayText;
        string newText = "";
        int maxWidth = e.Bounds.Width - 20;
        SizeF textSize =e.Graphics.MeasureString(text, e.Appearance.Font);
        if (textSize.Width >= maxWidth)
        {
          string textPom = "";
          for (int i = 0; i < text.Length; i++)
          {
            textPom = text.Substring(0, i) + "...";
            textSize = e.Graphics.MeasureString(textPom, e.Appearance.Font);
            if (textSize.Width >= maxWidth)
            {
              newText = text.Substring(0, i - 1) + "...";
              break;
            }
          }
          e.DisplayText = newText;
        }           
      }
    }

Преимущество этого решения заключается в том, что обрезка только того, что смещено, но в тексте с данными остается в исходном виде

Другие вопросы по тегам