Justen
Justen

Reputation: 4869

How do I edit data being bound to a datagrid?

In reference to Link loaded into my gridview try to navigate to my local server. The columns I have in the datagrid are Customer #, Description, Link.

I've got a function set up that's called on rowDataBound, but how do I retrieve what link is in the row so that I can edit it, and then rebind it to the datagrid?

protected void grdLinks_RowDataBound( object sender, GridViewRowEventArgs e )
{
    if ( e.Row.RowIndex == 2 )
    {

    }
}

And here is my gridview code

<asp:GridView ID="grdLinks" runat="server" AutoGenerateColumns="False" DataSourceID="ldsCustomerLinks"
            OnRowDataBound="grdLinks_RowDataBound" EmptyDataText="No data was returned."
            DataKeyNames="ID" OnRowDeleted="grdLinks_RowDeleted" Width="80%" BackColor="White"
            HorizontalAlign="Center" BorderColor="#999999" BorderStyle="None" BorderWidth="1px"
            CellPadding="3" GridLines="Vertical">
            <RowStyle BackColor="#EEEEEE" ForeColor="Black" />
            <Columns>
                <asp:BoundField DataField="CustomerNumber" HeaderText="Customer Number" SortExpression="CustomerNumber" />
                <asp:BoundField DataField="Description" HeaderText="Description" SortExpression="Description" />
                <asp:HyperLinkField DataTextField="Link" HeaderText="Link" SortExpression="Link" DataNavigateUrlFields="Link" Target="_blank" />
            </Columns>
</asp:GridView>

<asp:LinqDataSource ID="ldsCustomerLinks" runat="server" ContextTypeName="ComplianceDataContext"
            TableName="CustomerLinks" EnableDelete="true">
</asp:LinqDataSource>

Upvotes: 1

Views: 512

Answers (3)

Brian Schmitt
Brian Schmitt

Reputation: 6068

You may also want to look into letting the gridview do it for you.

You can use the datanavigateurlformatstring property to insert querystring parameters if that's what you are trying to do.

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.hyperlinkfield.datanavigateurlformatstring.aspx

Upvotes: 0

CAbbott
CAbbott

Reputation: 8098

If I'm understanding you correctly, you want to get the value of a data item called Link. If so, then something like this should work:

EDIT: I think what you're saying is that you want to grab the value Link from the database, manipulate it and then set the Url of the HyperLink to the new, manipulated value, if so then it would look like this:

ASPX Page (Updated to reflect posted code)

<Columns>
    <asp:BoundField DataField="CustomerNumber" HeaderText="Customer Number" SortExpression="CustomerNumber" />
    <asp:BoundField DataField="Description" HeaderText="Description" SortExpression="Description" />
    <asp:TemplateField HeaderText="Link"> 
        <ItemTemplate>
            <asp:HyperLink ID="hlParent" runat="server" Text='<% #(Eval("Link")) %>' />
        </ItemTemplate>
    </asp:TemplateField>
</Columns>

I modified the ASP from your original question by adding an ID and removing the reference to the NavigateUrl attribute from the HyperLink control.

Code

protected void grdLinks_RowDataBound( object sender, GridViewRowEventArgs e )
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        string link = DataBinder.Eval(e.Row.DataItem, "Link") as string;
        if (link != null && link.Length > 0)
        {
            // "FindControl" borrowed directly from DOK
            HyperLink hlParent = (HyperLink)e.Row.FindControl("hlParent");
            if (hlParent != null)
            {
                // Do some manipulation of the link value 
                string newLink = "https://" + link

                // Set the Url of the HyperLink  
                hlParent.NavigateUrl = newLink;
            }
        }
    }
}

Upvotes: 1

DOK
DOK

Reputation: 32851

RowDataBound is called for every row in the GridView, including headers, footers, etc. Therefore, you should start by examining only the rows containing data.

Once you're on a row, there are several ways to examine the cells. One is just to use the cell index (2 here). That seems simple in your situation, but will lead to frustration if you ever rearrange the columns.

Here's an example of that from MSDN:

void CustomersGridView_RowDataBound(Object sender, GridViewRowEventArgs e)
  {

    if(e.Row.RowType == DataControlRowType.DataRow)
    {
      // Display the company name in italics.
      e.Row.Cells[1].Text = "<i>" + e.Row.Cells[1].Text + "</i>";

    }

A better way is to use FindControl with the item's ID.

protected void gvBarcode_RowDataBound(object sender, GridViewRowEventArgs e)
{
   if (e.Row.RowType == DataControlRowType.DataRow)
   {
     HyperLink hlParent = (HyperLink)e.Row.FindControl("hlParent");
   }
}

Upvotes: 1

Related Questions