bind gridview dynamically with label and tooltip
i want to bind gridview with datatable in code behind and i want to add label in each cell in gridview and display a tooltip on label of their values... i am not getting tool tip.. (i want to display an each seat of thatre stage) !!! and want to tooltip of it,and my stage may change,so i want dynamically)
help me.. my code is here
//Grid view is bind on page load it gives me Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index
开发者_高级运维 protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
for (int i = 0; i < table.Rows.Count; i++)
{
for (int j = 0; j < table.Columns.Count; j++)
{
Label lbl = new Label();
lbl.Text = GridView1.DataKeys[e.Row.RowIndex]["LabelText"].ToString();
lbl.ToolTip = GridView1.DataKeys[e.Row.RowIndex]["TooltipText"].ToString();
e.Row.Cells[0].Controls.Add(lbl);
}
}
}
You need to add the Label to a cell in each row of the GridView. I would suggest storing the information for the Label and the tooltip in the data key collection, and adding the label in the OnRowDataBound event.
Option 1:
EDIT: Added markup to show how to add data keys
Define the data keys like in the example below. Replace LabelTextColumn
and TooltipTextColumn
with the actual you want to use for the text and the tooltip. Also, notice how the OnRowDataBound event handler is set here:
<asp:GridView ID="GridView1" runat="server" DataKeyNames="LabelTextColumn, TooltipTextColumn" OnRowDataBound="GridView1_RowDataBound" ...>
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" />
</ItemTemplate>
</asp:TemplateField>
...
</Columns>
</asp:GridView>
EDIT: Corrected error using RowIndex to get data keys
Since you're in the RowDataBoundEvent, you don't need to use a loop. The RowDataBound
event is called from within a loop as each row is databound, which is why you have access the current row with e.Row
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
//we don't need this anymore, because the label is already in the row
//Label lbl = new Label();
//get the label from the row
Label lbl = (Label)e.Row.FindControl("Label1");
--set the text and tooltip text using the datakeys specified in the markup
lbl.Text = grd.DataKeys[e.Row.RowIndex]["LabelTextColumn"].ToString();
lbl.ToolTip = grd.DataKeys[e.Row.RowIndex]["TooltipTextColumn"].ToString();
//we don't need this anymore either, because the label is already added to the row
//e.Row.Cells[0].Controls.Add(lbl);
}
Option 2: Using inline Eval() function to set the text and tooltip text
<asp:GridView ID="GridView1" runat="server" ...>
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%#Eval("LabelTextColumn")' Tooltip='<%#Eval("TooltipTextColumn")%>' />
</ItemTemplate>
</asp:TemplateField>
...
</Columns>
</asp:GridView>
When you databind, it destroys the current control collection and populates with the provided data source.
For your specific application, you would also need to attach to the GridView.RowCreated
event and then insert the tooltip you need.
Implement this in a handler for the Gridview.RowDataBound Event.
精彩评论