Ответ 1
Кажется, что он не превращает его в строку. Попробуйте
row.HeaderCell.Value = String.Format("{0}", row.Index + 1);
Можно ли показать номер строки в заголовке строки DataGridView
?
Я пытаюсь использовать этот код, но он не работает:
private void setRowNumber(DataGridView dgv)
{
foreach (DataGridViewRow row in dgv.Rows)
{
row.HeaderCell.Value = row.Index + 1;
}
}
Нужно ли устанавливать свойство DataGridView
?
Кажется, что он не превращает его в строку. Попробуйте
row.HeaderCell.Value = String.Format("{0}", row.Index + 1);
Вы также можете нарисовать строку динамически внутри события RowPostPaint
:
private void dgGrid_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{
var grid = sender as DataGridView;
var rowIdx = (e.RowIndex + 1).ToString();
var centerFormat = new StringFormat()
{
// right alignment might actually make more sense for numbers
Alignment = StringAlignment.Center,
LineAlignment = StringAlignment.Center
};
var headerBounds = new Rectangle(e.RowBounds.Left, e.RowBounds.Top, grid.RowHeadersWidth, e.RowBounds.Height);
e.Graphics.DrawString(rowIdx, this.Font, SystemBrushes.ControlText, headerBounds, centerFormat);
}
Спасибо @Gabriel-Perez и @Groo, отличная идея! Если другие хотят этого, здесь версия в VB тестируется в Visual Studio 2012. В моем случае я хотел, чтобы цифры отображались в правом верхнем углу в заголовке строки.
Private Sub MyDGV_RowPostPaint(sender As Object, _
e As DataGridViewRowPostPaintEventArgs) Handles MyDataGridView.RowPostPaint
' Automatically maintains a Row Header Index Number
' like the Excel row number, independent of sort order
Dim grid As DataGridView = CType(sender, DataGridView)
Dim rowIdx As String = (e.RowIndex + 1).ToString()
Dim rowFont As New System.Drawing.Font("Tahoma", 8.0!, _
System.Drawing.FontStyle.Bold, _
System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Dim centerFormat = New StringFormat()
centerFormat.Alignment = StringAlignment.Far
centerFormat.LineAlignment = StringAlignment.Near
Dim headerBounds As Rectangle = New Rectangle(_
e.RowBounds.Left, e.RowBounds.Top, _
grid.RowHeadersWidth, e.RowBounds.Height)
e.Graphics.DrawString(rowIdx, rowFont, SystemBrushes.ControlText, _
headerBounds, centerFormat)
End Sub
Вы также можете получить шрифт по умолчанию rowFont = grid.RowHeadersDefaultCellStyle.Font
, но он может выглядеть не так хорошо. На скриншоте ниже используется шрифт Tahoma.
private void setRowNumber(DataGridView dgv)
{
foreach (DataGridViewRow row in dgv.Rows)
{
row.HeaderCell.Value = (row.Index + 1).ToString();
}
}
Это сработало для меня.
просто улучшаем вышеприведенное решение.. поэтому заголовок сам меняет свою ширину, чтобы вместить длинную строку, такую как 12345
private void advancedDataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{
var grid = sender as DataGridView;
var rowIdx = (e.RowIndex + 1).ToString();
var centerFormat = new StringFormat()
{
// right alignment might actually make more sense for numbers
Alignment = StringAlignment.Center,
LineAlignment = StringAlignment.Center
};
//get the size of the string
Size textSize = TextRenderer.MeasureText(rowIdx, this.Font);
//if header width lower then string width then resize
if (grid.RowHeadersWidth < textSize.Width + 40)
{
grid.RowHeadersWidth = textSize.Width + 40;
}
var headerBounds = new Rectangle(e.RowBounds.Left, e.RowBounds.Top, grid.RowHeadersWidth, e.RowBounds.Height);
e.Graphics.DrawString(rowIdx, this.Font, SystemBrushes.ControlText, headerBounds, centerFormat);
}
вы можете сделать это:
private void setRowNumber(DataGridView dgv)
{
foreach (DataGridViewRow row in dgv.Rows)
{
row.HeaderCell.Value = row.Index + 1;
}
dgv.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders);
}
row.HeaderCell.Value = row.Index + 1;
когда применяется к datagridview с очень большим количеством строк, создается утечка памяти и в конечном итоге приведет к проблеме с нехваткой памяти. Любые идеи о том, как восстановить память?
Вот пример кода для применения к пустой сетке с некоторыми столбцами. он просто добавляет строки и номера индекса. Нажмите кнопку повтора несколько раз.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
dataGridView1.SuspendLayout();
for (int i = 1; i < 10000; i++)
{
dataGridView1.Rows.Add(i);
}
dataGridView1.ResumeLayout();
}
private void button1_Click(object sender, EventArgs e)
{
foreach (DataGridViewRow row in dataGridView1.Rows)
row.HeaderCell.Value = (row.Index + 1).ToString();
}
}
Немного поздно, но я использовал VB.NET и событие RowPostPaint НЕ, потому что у меня был бесконечный цикл. Используйте кнопку или код места, где вы связываете базу данных с DataGridView.
Это сработало для меня.
Private Sub GridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles GridView1.CellFormatting
Dim idx As Integer = e.RowIndex
Dim row As DataGridViewRow = VDataGridView1.Rows(idx)
Dim newNo As Long = idx
If Not _RowNumberStartFromZero Then
newNo += 1
End If
Dim oldNo As Long = -1
If row.HeaderCell.Value IsNot Nothing Then
If IsNumeric(row.HeaderCell.Value) Then
oldNo = CLng(row.HeaderCell.Value)
End If
End If
If newNo <> oldNo Then 'only change if it wrong or not set
row.HeaderCell.Value = newNo.ToString()
row.HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight
End If
End Sub
Эта работа в С#
private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
int idx = e.RowIndex;
DataGridViewRow row = dataGridView1.Rows[idx];
long newNo = idx;
if (!_RowNumberStartFromZero)
newNo += 1;
long oldNo = -1;
if (row.HeaderCell.Value != null)
{
if (IsNumeric(row.HeaderCell.Value))
{
oldNo = System.Convert.ToInt64(row.HeaderCell.Value);
}
}
if (newNo != oldNo)
{
row.HeaderCell.Value = newNo.ToString();
row.HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight;
}
}
private void ShowRowNumber(DataGridView dataGridView)
{
dataGridView.RowHeadersWidth = 50;
for (int i = 0; i < dataGridView.Rows.Count; i++)
{
dataGridView.Rows[i].HeaderCell.Value = (i + 1).ToString();
}
}