أضف صف Gridview بعد الرأس
سؤال
أحاول إضافة رأس جديد إلى Gridview.يجب أن يظهر هذا الصف أسفل رأس الصفحة الأصلي.
بقدر ما أعرف لدي حدثين للاختيار من بينها:
1.) GridView_RowDatabound 2.) GridView_Rowcreated
الخيار 1 ليس خيارًا لأن الشبكة لا تربط البيانات في كل إعادة نشر.الخيار 2 لا يعمل كما هو متوقع.يمكنني إضافة الصف، ولكن تتم إضافته قبل HeaderRow لأن HeaderRow نفسه لم تتم إضافته بعد في هذا الحدث...
الرجاء المساعدة، شكرا لك!
شفرة:(يتم عرض خاصية InnerTable بواسطة طريقة عرض الشبكة المخصصة)
Private Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound
If e.Row.RowType = DataControlRowType.Header Then
Dim r As New GridViewRow(-1, -1, DataControlRowType.Header, DataControlRowState.Normal)
For Each c As DataControlField In CType(sender, GridView).Columns
Dim nc As New TableCell
nc.Text = c.AccessibleHeaderText
nc.BackColor = Drawing.Color.Cornsilk
r.Cells.Add(nc)
Next
Dim t As Table = GridView1.InnerTable
t.Controls.Add(r)
End If
End Sub
المحلول
نظرًا لأن هذا هو GridView مخصص، فلماذا لا تفكر في تجاوز طريقة CreateChildControls؟
على سبيل المثال (آسف، C#):
protected override void CreateChildControls()
{
base.CreateChildControls();
if (HeaderRow != null)
{
GridViewRow header = CreateRow(-1, -1, DataControlRowType.Header, DataControlRowState.Normal);
for (int i = 0; i < Columns.Count; i++)
{
TableCell cell = new TableCell();
cell.Text = Columns[i].AccessibleHeaderText;
cell.ForeColor = System.Drawing.Color.Black;
cell.BackColor = System.Drawing.Color.Cornsilk;
header.Cells.Add(cell);
}
Table table = (Table)Controls[0];
table.Rows.AddAt(1, header);
}
}
تحديثكما ذكر Ropstah، فإن المقتطف أعلاه لا يعمل مع ترقيم الصفحات.لقد قمت بنقل الكود إلى PreparationControlHierarchy وهو الآن يعمل بأمان مع ترقيم الصفحات والاختيار والفرز.
protected override void PrepareControlHierarchy()
{
if (ShowHeader && HeaderRow != null)
{
GridViewRow header = CreateRow(-1, -1, DataControlRowType.Header, DataControlRowState.Normal);
for (int i = 0; i < Columns.Count; i++)
{
TableCell cell = new TableCell();
cell.Text = Columns[i].AccessibleHeaderText;
cell.ForeColor = System.Drawing.Color.Black;
cell.BackColor = System.Drawing.Color.Cornsilk;
header.Cells.Add(cell);
}
Table table = (Table)Controls[0];
table.Rows.AddAt(1, header);
}
//it seems that this call works at the beginning just as well
//but I prefer it here, since base does some style manipulation on existing columns
base.PrepareControlHierarchy();
}
نصائح أخرى
ورفاق العمل لطيف، وأنا استخدم الأسلوب الخاص بك لتجميع بلدي AJAX تمكين gridview، ولقد بحثت لوقت طويل. الهتافات.
protected override void PrepareControlHierarchy()
{
if (GroupColumns)
{
#region Group Column
Table table = (Table)Controls[0];
string lastValue = string.Empty;
foreach (GridViewRow gvr in this.Rows)
{
string currentValue = gvr.Cells[GroupColumnIndex].Text;
if (lastValue.CompareTo(currentValue) != 0)
{
// there's been a change in value in the sorted column
int rowIndex = table.Rows.GetRowIndex(gvr);
// Add a new sort header row
GridViewRow sortRow = new GridViewRow(rowIndex, rowIndex, DataControlRowType.DataRow, DataControlRowState.Normal);
TableCell sortCell = new TableCell();
TableCell blankCell = new TableCell();
sortCell.ColumnSpan = this.Columns.Count - 1;
sortCell.Text = string.Format("{0}", currentValue);
blankCell.CssClass = "group_header_row";
sortCell.CssClass = "group_header_row";
// Add sortCell to sortRow, and sortRow to gridTable
sortRow.Cells.Add(blankCell);
sortRow.Cells.Add(sortCell);
table.Controls.AddAt(rowIndex, sortRow);
// Update lastValue
lastValue = currentValue;
}
}
#endregion
}
HideColumns();
base.PrepareControlHierarchy();
}
وجرب هذا عند إضافة صف إلى InnerTable:
t.Controls.AddAt(1, r)
وفيما يلي اختبار سريع الأساسي فعلت، والذي يبدو للعمل OK:
Protected Sub gridview_DataBound(ByVal sender As Object, ByVal e As System.EventArgs) Handles gridview.DataBound
Dim g As GridView = CType(sender, GridView)
Dim r As New GridViewRow(0, -1, DataControlRowType.Header, DataControlRowState.Normal)
Dim th As New TableHeaderCell()
th.ColumnSpan = g.Columns.Count
th.Text = "This is my new header"
r.Cells.Add(th)
Dim t As Table = CType(g.Controls(0), Table)
t.Rows.AddAt(1, r)
End Sub