Простая проверка элементов списка (предотвращение дублирования) - PullRequest
0 голосов
/ 12 сентября 2011

Привет, в настоящее время у меня есть код, который получает значение элемента списка и проверяет, существует ли значение в этом списке (значение в столбце «Номер телефона»), снова значение, введенное в HTML-форме.Если запись, которая будет введена в список через эту HTML-форму, содержит номер телефона, который уже находится в списке, запись не будет добавлена.Это хорошо работает для первого элемента в списке, однако, когда другой элемент добавляется в список с другим номером телефона, код, похоже, не подхватывает номер телефона для второй записи, и поэтому, если третья запись вводится сТот же номер телефона, что и во второй записи, проверка не происходит, код продолжает смотреть на первую запись.Вот список моего кода:


SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite site = new SPSite(valueListURL))

{
using (SPWeb web = site.OpenWeb())
{

try
{

//--This is very important--
web.AllowUnsafeUpdates = true;

SPList list = web.Lists["Contact Requests"];

SPListItemCollection collsListItems = list.Items;


//Following lines of code added for validation
oreach (SPListItem objListItem in list.Items)
{
string valuePhonenumber = objListItem["Phone number"].ToString();
string valueEmailaddress = objListItem["Email address"].ToString();

SPListItem newItem = list.Items.Add();

if (TextBox3.Text != valuePhonenumber)
{
newItem["Contact name"] = TextBox1.Text;
TextBox1.Text = null;
newItem["Company"] = TextBox2.Text;
TextBox2.Text = null;
newItem["Phone number"] = TextBox3.Text;
this.TextBox3.Text = null;


newItem["Email address"] = TextBox4.Text;
TextBox4.Text = null;
newItem["Best time to call you"] = TextBox5.Text;
TextBox5.Text = null;
newItem["Enquiry subject"] = DropDownList1.SelectedItem;
this.DropDownList1.ClearSelection();
newItem["Enquiry details"] = TextBox6.Text;
this.TextBox6.Text = null;


if (RadioButton1.Checked)
newItem["Contact method"] = Label1.Text;
this.RadioButton1.Checked = false;
if (RadioButton2.Checked)
newItem["Contact method"] = Label2.Text;
this.RadioButton2.Checked = false;

newItem.Update();
}

//this.Response.Redirect(Request.RawUrl);

//Lines of code below used to insert or inject a javacript in order to close
//modeal dialog box at the press of the button

this.Page.Response.Clear();
this.Page.Response.Write("
<script  type=text/javascript>window.frameElement.commonModalDialogClose(1, 1);</script>");
//this.Page.Response.Write("Submitted!"); //replacement for the above javascript
this.Page.Response.End();



}
}

catch (Exception doh)
{
 DisplayError(doh);
}
}
}
});

Я думаю об использовании цикла foor для итерации по элементам списка для проверки существующих записей телефонных номеров.Я думаю о том, чтобы поместить if (TextBox3.Text! = ValuePhonenumber) {}, показанный в коде выше, внутри цикла foor, но я не уверен, как этого добиться, не нарушая код.Буду очень признателен, если кто-нибудь может помочь мне с этим!

Заранее спасибо,

Обновление !!!

Я сейчас использую запрос caml для запроса списка дляв этом случае обязательное значение - это значение, введенное в HTML-форме в TextBox3.Text.Результат qquery затем сохраняется в объекте "listItemsCollection".Затем я использую эту проверку, чтобы проверить, что если значение в «TextBox3.text» не равно значению, хранящемуся в «listItemsCollection», то записи добавляются в список, если оно равно, записи не добавляются.Код приведен ниже:

SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite site = new SPSite(valueListURL))
//using (SPSite site = new SPSite(webUrl))               
{
using (SPWeb web = site.OpenWeb())
{

try
{
//added to resolve the issue with security validation on the page
//--This is very important--
web.AllowUnsafeUpdates = true;

SPList list = web.Lists["Contact Requests"]

SPQuery query = new SPQuery();

// try and find phone number we dont want to add in list
string camlquery = "<Where><Eq><FieldRef Name='Phone number'/>" + "<Value Type='Text'>" 
+ TextBox3.Text + "</Value></Eq></Where>";
query.Query = camlquery;

SPListItemCollection listItemsCollection = list.GetItems(query);
if (TextBox3.Text != listItemsCollection.ToString()) // if it doesn't exist in list, 
//we can add it records
{

SPListItem newItem = list.Items.Add();

// add code goes here
newItem["Contact name"] = TextBox1.Text;
TextBox1.Text = null;
newItem["Company"] = TextBox2.Text;
TextBox2.Text = null;
newItem["Phone number"] = TextBox3.Text;
this.TextBox3.Text = null;


newItem["Email address"] = TextBox4.Text;
TextBox4.Text = null;
newItem["Best time to call you"] = TextBox5.Text;
TextBox5.Text = null;
newItem["Enquiry subject"] = DropDownList1.SelectedItem;
this.DropDownList1.ClearSelection();
newItem["Enquiry details"] = TextBox6.Text;
this.TextBox6.Text = null;

if (RadioButton1.Checked)
newItem["Contact method"] = Label1.Text;
this.RadioButton1.Checked = false;
if (RadioButton2.Checked)
newItem["Contact method"] = Label2.Text;
this.RadioButton2.Checked = false;

newItem.Update();
}

//this.Response.Redirect(Request.RawUrl);

//Lines of code below used to insert or inject a javacript in order to close
//modeal dialog box at the press of the button

this.Page.Response.Clear();
this.Page.Response.Write("<script  
type=text/javascript>window.frameElement.commonModalDialogClose(1, 1);</script>");
//this.Page.Response.Write("Submitted!"); //replacement for the above javascript
this.Page.Response.End();



}



catch (Exception doh)
{
DisplayError(doh);
}
}
}
});

До этого я мало что делал с CAML, поэтому мне кажется, что я борюсь с чем-то таким простым.Будем очень благодарны за любые пожелания получить эту работу!

Большое спасибо заранее

Ответы [ 3 ]

0 голосов
/ 13 сентября 2011

Я наконец-то обнаружил, в чем проблема, после некоторого чтения, очевидно, когда имеешь дело с CAML, кажется, лучше предоставить внутреннее системное имя столбца или поля списка. В моем случае я использовал «Номер телефона», поэтому все не работало.

string camlquery = @"<Where>
<Eq>
<FieldRef Name='Phone_x0020_number'/>
<Value Type='Text'>" + TextBox3.Text + @"</Value>
</Eq>
</Where>";
query.Query = camlquery;

SPListItemCollection listItemsCollection = list.GetItems(query);

if (listItemsCollection.Count == 0) // if it doesn't exist in list, we can add it
{

}

Но просто предоставив внутреннее системное имя для столбца или поля списка, как показано выше ('Phone_x0020_number'). Теперь все работает. После того, как все это время сломало мою голову, все, что требовалось, было внутренним системным именем для столбца .....

0 голосов
/ 05 октября 2011
private bool TryGetItem(Guid key, string value, SPList list, out SPListItemCollection items)
   {
       SPQuery query = new SPQuery();

       string @template = @"<Where>
                                <Eq>
                                    <FieldRef Name='{1}'/>
                                    <Value Type='Text'>{0}</Value>
                                </Eq>
                             </Where>";

       query.Query = string.Format(@template, key.ToString("D"), value);

       items = list.GetItems(query);

       return items.Count > 0;
   }
0 голосов
/ 12 сентября 2011

Вы можете достичь этого, используя CAML Query. Вы просто создаете запрос, в котором номер телефона равен (или содержит, зависит от ваших требований) ввод из формы HTML. При выполнении запроса возвращается набор результатов (SPListItemCollection). Если этот набор результатов уже содержит элемент, вы знаете, что он является дубликатом, и не добавляете новый элемент. Обратитесь к этой статье, если вы еще не работали с CAML-запросами:

http://sharepointmagazine.net/articles/writing-caml-queries-for-retrieving-list-items-from-a-sharepoint-list

...