views:

24

answers:

1

Is there an easy way to trim values in a details view during edit mode? I tried modifying the database query to trim the values, but it didn't like to do both ways databinding after that. I tried looking through all the properties of the text boxes themselves and found nothing.

I know I could add an event handler for the databound event, and set all of the values one by one, but this is an application that has existed since before my employment and there are over 40 values in this details view, all in text boxes with seemingly random names that have little to do with the values they represent or obvious naming scheme.

I thought maybe there was a way to way to iterate over the DetailsView.Fields property, but couldn't figure anything out there either. I am not allowed to change the schema from CHAR to VARCHAR either. Any other quick ideas? There is a strong likelihood this page will change again, and I would like something that might take care of this problem for any new fields added in the future without extra work. Unfortunately, redesigning it is not anywhere near a top priority right now, so a quick fix to alleviate some of the headache of using this monstrosity is all I am looking for.

+2  A: 

Disclaimer: I've used this on a GridView, not a DetailsView, but the concept is the same.

Create an EditItemTemplateField, Bind the data to the textbox, convert it to a string, and trim the string.

<Fields>
    <asp:TemplateField HeaderText="FirstName">
        <EditItemTemplate>
            <asp:TextBox ID="txtFirstName" Runat="server" Text='<%#Bind("FirstName").ToString().Trim() %>'/>
        </EditItemTemplate>
    </asp:TemplateField>
</Fields>

EDIT: This does not work, as you cannot perform conversions when binding data, only when Eval is used unfortunately.

The alternative is to iterate through each control when the DetailsView is updating.

  void DetailsView1_ItemUpdating(object sender, 
    DetailsViewUpdateEventArgs e)
  {
    for (int i = 0; i < e.NewValues.Count; i++)
    {
      if (e.NewValues[i] != null)
      {
        e.NewValues[i] = e.NewValues[i].ToString().Trim();
      }
    }
  }

Note, this example assumes all controls on your page are strings, if they aren't you'll have to exclude them.

Damien Dennehy
+1 - Binding expressions work for all the templated controls.
womp
Exactly what I was looking for, thank you. Was trying to do things through the designer and events, didn't even think about the page markup.
NickLarsen
Actually when I tried this, it ended up giving me the error `A call to Bind was not well formatted. Please refer to documentation for the correct parameters to Bind`. Still looking up ways to fix that; any ideas?
NickLarsen
Apologies, it seems you cannot perform string conversions when binding data - you'll have to iterate through each control it seems.
Damien Dennehy
Thanks for the update.
NickLarsen