2013-12-13 4 views
0

В каждом цикле я хочу по умолчанию значения массива сосудистого зажима, но он принимает старые значения сосудистого зажима [4] такжеМассива в forloop правопреемник УСПЕШНОГО значения сеанса

for (int i = 0; i < rptSize.Items.Count; i++) 
{ 
    Label lblSizeCount = (Label)rptSize.Items[i].FindControl("lblSizeCount"); 
    HiddenField hfSizeID = (HiddenField)rptSize.Items[i].FindControl("hfSizeID"); 

    string[] serRefine = (string[])Session["RefineSelection"]; 
    if (serRefine[4].ToString() != "") 
    { 
     string Finalsids = ""; 
     string[] sids = serRefine[4].Split(','); 
     for (int j = 0; j < sids.Length; j++) 
     { 
      if (sids[j].ToString() != hfSizeID.Value) 
       Finalsids += sids[j].ToString() + ","; 
     } 
     Finalsids += hfSizeID.Value; 

     Finalsids = Finalsids.TrimEnd(','); 
     serRefine[4] = Finalsids; 
    } 
    else 
     serRefine[4] = hfSizeID.Value; 

    lblSizeCount.Text = CommonManager.GetProductCountWithAll(serRefine); 
} 
+1

, что проблема, которую Вы получаете с этим кодом? –

+1

Просто угадайте: вы привязываете 'Repater' в' Page_Load' даже к обратной почте, что заставляет его потерять все измененные значения. Используйте свойство 'IsPostBack'' '' '. –

+0

, но мои значения массива начинаются с сеанса –

ответ

0

Теперь я понял, проблему. Вы хотите, чтобы массив находился в исходном состоянии на каждой итерации. Но это не так, потому что это ссылочный тип, и вы изменяете его в цикле. Вот упрощенный пример, чтобы воспроизвести это поведение:

string[] RefineSelection = new[] {"A", "B", "C", "D", "E" }; 
for (int i = 1; i <= 3; i++) 
{ 
    string[] serRefine = RefineSelection; // you're not creating a copy but you're referencing the session-array 
    string hfSizeID = "foo" + i; 
    Console.WriteLine(string.Join(",", RefineSelection)); 
    serRefine[4] = hfSizeID; 
    Console.WriteLine(string.Join(",", RefineSelection)); 
} 

выход будет:

A,B,C,D,E 
A,B,C,D,foo0 
A,B,C,D,foo0 
A,B,C,D,foo1 
A,B,C,D,foo1 
A,B,C,D,foo2 

Таким образом, «Foo» значение из последней итерации будет использоваться, прежде чем он будет изменен. Как уже упоминалось, это потому, что массив является ссылочным типом, а область переменной не является самим циклом, поэтому используется одна и та же ссылка.

Вы можете создать клон из Session массива:

for (int i = 0; i < rep.Count; i++) 
{ 
    string[] copy = (string[])RefineSelection.Clone(); 
    string hfSizeID = "foo" + i; 
    Console.WriteLine(string.Join(",", copy)); 
    copy[4] = hfSizeID; 
    Console.WriteLine(string.Join(",", copy)); 
} 

Выход:

A,B,C,D,E 
A,B,C,D,foo0 
A,B,C,D,E 
A,B,C,D,foo1 
A,B,C,D,E 
A,B,C,D,foo2 
Смежные вопросы