Click here to Skip to main content
15,890,185 members
Please Sign up or sign in to vote.
2.25/5 (3 votes)
See more:
I have a list named "Designation" that contains a Designation Code and Designation Name.

I have another list named "Employee" that contains Employee Name and Designation Name (as a Lookup Field).

I am able to insert values to "Employee" list using the following code.
C#
protected void AddEmp(object sender, EventArgs e)
{
            string emp_name = txtEmployeeName.Text;
            string emp_designation = ddlDesignation.SelectedValue;
                    
    using (SPSite site = new SPSite("My Site"))
            {
                using (SPWeb web = site.OpenWeb())
                {
                    SPSecurity.RunWithElevatedPrivileges(delegate()
                    {
                        web.AllowUnsafeUpdates = true;
SPList splist_employees = web.Lists["Employee"];

SPList splist_designations = web.Lists["Designations"];

                        SPListItemCollection splc_items = splist_employees.Items;
                        SPListItem spli_item = splc_items.Add();
                        SPFieldLookup lookup = splist_employees.Fields["Designated"] as SPFieldLookup;

                        string fieldName = lookup.LookupField;
                        spli_item["Employee Name"] = emp_name;
                        spli_item[fieldName] = GetLookFieldIDS(emp_designation, splist_designations);

                        spli_item.Update();

                    });
                }
            }

}

        public static string GetLookFieldIDS(string lookupValues, SPList lookupSourceList)
        {
            string id = string.Empty;
            SPFieldLookupValueCollection lookupIds = new SPFieldLookupValueCollection();
            SPQuery query = new Microsoft.SharePoint.SPQuery();
            query.Query = "<where><eq><fieldref name="Designation" /><value type="Text">" + lookupValues + "</value></eq></where>";
            SPListItemCollection listItems = lookupSourceList.GetItems(query);
            foreach (Microsoft.SharePoint.SPListItem item in listItems)
            {
                id = item.ID.ToString();
            }
            return id;
        }

Here I have given the field name as 'Designation' inside the query.

But, I want to find the field name based on the value given from the user end instead of hard-coding the field name as 'Designation'.

Any help is greatly appreciated.

Thanks in advance.
Posted
Updated 25-May-12 1:06am
v2
Comments
[no name] 25-May-12 8:19am    
What version of SharePoint are you using?
Georby 28-May-12 1:49am    
I'm using SharePoint 2010 version.

1 solution

Assuming the value of the dropdownlist is the ID of the lookup item

SPFieldLookupValue value = new SPFieldLookupValue(id, id.ToString());
item["field_name"] = value.ToString();


You also have a few thing that need corrected with your code. First, is there a reason to use RunWithElevatedPrivledges? It should not be used casually. If the user doesn't have the permissions to create a listitem then should they even have access to the functionality? If you do need to use RunWithElevatedPrivledges then the SPWeb object should be obtained within its context. As you have it, the SPWeb object is obtained using the context for the current user making the use of RunWithElevatedPrivledges irrelevant.

You set web.AllowUnsafeUpdates = true; but never return it to false. True the next time a SPWeb.Invalidate() call is made it will revert back to false. However, in the mean time you have exposed a security hole to your environment. Since you are running with elevated privileges setting AllowUnsafeUpdates isn't even necessary.

You are also using OpenWeb() to get the SPWeb object which by default will use the rootweb. You should use the the SPSite.RootWeb property instead. This uses fewer resources and doesn't need to be disposed of.

You should be using defensive coding and check if the lists are valid, or handle exceptions if not, before using them. You have no control over whether the lists have been removed or renamed, anyone with sufficient privileges can do so via the UI without you knowing about it. If you are using 2010 use the SPWeb.TryGetList method.

And of course all of this should be placed in a defined data and/or business layer not directing in the UI.
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900