Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In a C# TBB: how to split a multi SingleLineTextField into seperate strings

I have a plain textfield in Tridion that can have multiple values. The itemtype is a SingleLineTextField.

In the TBB code I have the following (removed the non-essential parts):

ItemFields itemFields = new ItemFields(folder.Metadata, folder.MetadataSchema);

foreach (ItemField itemField in itemFields)
{
    string itemFieldValue = string.Empty;
    switch (Utilities.GetFieldType(itemField))
    {
        case FieldType.SingleLineTextField:
            itemFieldValue = itemField.ToString();
            break;
    }
}

Now the result in case of two entries is just two strings with a character line break in it.

String A
String B

The method used is a generic one, which also works on other fields, so I was looking for some way to find out if a SingleLineTextField has more values in it.

like image 745
Hendrik Beenker Avatar asked Dec 20 '22 10:12

Hendrik Beenker


2 Answers

You can cast the field to a SingleLineTextField type, then iterate through the Values collection, something along these lines:

SingleLineTextField field = (SingleLineTextField)itemField;
foreach(string value in field.Values)
{
    // do something with value
}
// or if all you want is the count of values
int i = field.Values.Count;
like image 123
Nuno Linhares Avatar answered May 15 '23 11:05

Nuno Linhares


Firstly, I would advise against relying on the ToString() method on objects unless it is specifically documented. In this case it works with the abstract class ItemField, but this may not always be the case.

The TOM.Net API only defines Definition and Name properties for ItemField, so you need to cast your ItemField object to something more specific.

the TextField abstract class, which SingleLineTextField inherits from, defines a ToString() method, but also Value and Values properties, which are much better suited to what you're trying to do. Looking at the documentation, we can see that Values will give us an IList<String> of the values, even if your field is not multi-valued. Perfect!

So, to answer your question, "I was looking for some way to find out if a SingleLineTextField has more values in it", you need to cast your ItemField as a TextField and check the number of Values it provides, thus:

TextField textField = (TextField)itemField;

// If you need to deal with multi-valued fields separately
if (textField.Values.Count > 1)
{
    //Logic to deal with multiple values goes here
}
else
{
    //Logic to deal with single valued goes here
}

// Much better... If you can deal with any number of values in a generic fashion
foreach (string value in textField.Values)
{
    // Generic code goes here
}
like image 22
David Forster Avatar answered May 15 '23 13:05

David Forster