C#開發一應用的總結

滄海一滴發表於2013-06-26

要搭建測試環境。
Webbrowser使用方面:
重新載入一頁面後,要獲取新的內容要使用重新使用browser.Document獲取;

HtmlElement的GetElementsByTagName(html標記)是HtmlElement中包括的所有標記的集合,如果相同元素有巢狀時要注意。如:
<table>
<tr>
     <td>1</td>
</tr>
<tr>
<td>
        <table>
         <tr>
         <td>2</td>
         </tr><tr>
         <td>3</td>
        </tr>
       </table>
</td>
</tr>
</table>

如果獲取最外層table節點為HtmlElement  he,此時使用he.GetElementsByTagName(“tr”),則包含4個元素:

0:
<tr>
<td>1</td>
</tr>
1:
<tr>
<td>
<table>
<tr>
<td>2</td>
</tr><tr>
<td>3</td>
</tr>
</table>
</td>
</tr>
2:
<tr>
<td>2</td>
</tr>
3:
<tr>
<td>3</td>
</tr>

如果要獲取class屬性,要使用HtmlElement he;he.getAttribute(“className”); 或he.getAttribute(“classname”); 即不區分大小寫

下拉選單設定屬性:
he.SetAttribute("value", "2013-1-1");  
he.RaiseEvent("onChange");    //觸發onChange事件,如果在後續程式碼中使用he.invokeScript(js名稱);這個可以不用寫           


其它:

Dictionary使用中如果使用foreach travel時不能進行更改(增加、刪除、修改),否則會報錯:
Collection was modified; enumeration operation may not execute.
遍歷並修改:

#region Dictionary Travel modify
public static void mainTest()
{
    Dictionary<String, Int32> dic = new Dictionary<String, Int32>();
    dic.Add("1", 1);
    dic.Add("2", 2);
    dic.Add("3", 3);
    foreachTravelDic(dic);
    modifyDic1(dic);
    foreachTravelDic(dic);
    modifyDic2(dic);
    foreachTravelDic(dic);
    Console.ReadKey();
}


public static void foreachTravelDic(Dictionary<String, Int32> dic)
{
    foreach (KeyValuePair<String, Int32> kvp in dic)
    {
        Console.WriteLine(String.Format("Key:{0}; Value:{1}", kvp.Key, kvp.Value));
        //dic[kvp.Key] = 2;//此操作會報錯
    }
}

 

private static void modifyDic2(Dictionary<String, Int32> dic)
{
    String[] keyStr = dic.Keys.ToArray<String>();
    for (int i = 0; i < keyStr.Length; i++)
    {
        dic[keyStr[i]] = dic[keyStr[i]] + 22;
    }

}


private static void modifyDic1(Dictionary<String, Int32> dic)
{
    int dicCount = dic.Keys.Count;
    String[] strKey = new String[dicCount];
    dic.Keys.CopyTo(strKey, 0);//支援.net2.0
    for (int i = 0; i < strKey.Length; i++)
    {
        if (dic.ContainsKey(strKey[i]))
        {
            dic[strKey[i]] = dic[strKey[i]] + 11;
        }
    }
}
#endregion
output:
image

補充:
foreach在travel Dictionary時報錯的原因:
http://www.cnblogs.com/dudu/archive/2006/07/31/464391.html
在執行foreach時,其他執行緒對_dictionary進行了Add操作,改變了_dictionary中的資料,從而產生了上述的異常資訊。

     那為什麼會產生這樣的異常資訊呢?
     foreach實際上執行的程式碼是:   

Dictionary<int, int>.Enumerator enumerator = _dictionary.GetEnumerator(); 
try

while (enumerator.MoveNext())  
   { 
    } 

finally

   IDisposable d = enumerator as IDisposable; 
if (d != null) d.Dispose(); 
}

     通過Reflector檢視Dictionary<TKey, TValue>.Enumerator.MoveNext()原始碼,我們會發現開始處有這樣的程式碼:

if (this.version != this.dictionary.version)
      {
            ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EnumFailedVersion);
      }

     而異常就是在這裡發生的,因為Add操作時改變了Dictionary的version,通過檢視Insert(TKey key, TValue value, bool add)的原始碼會看出。
     我覺得Dictionary<TKey, TValue>應該提供一個方法,可以設定在MoveNext時是否進行版本檢查,因為有時在foreach操作時,可能並不關心Dictionary中的資料是否被修改,我遇到的就是這樣的情況,現在由於這個問題而不能使用foreach,而只能採取其他方法遍歷Dictionary<TKey, TValue>中的資料。


Dictionary型別在作為引數傳遞時:
public static void Main(String[] args) {
           #region test Dic
            IDictionary<String,String> sumDic=new Dictionary<String,String>();
            IDictionary<String, String> secDic = new Dictionary<String, String>();
            sumDic.Add("ak","av");
            sumDic.Add("bk", "bv");
            sumDic.Add("ck", "cv");
            sumDic.Add("dk", "dv");
            sumDic.Add("ek", "ev");

            secDic = testDic(sumDic);//引用傳遞
            foreach (KeyValuePair<String, String> kvp in sumDic)
            {
                Console.WriteLine(String.Format("{0}====>{1}",kvp.Key,kvp.Value));
            }
            Console.WriteLine("----------------------------");
            foreach (KeyValuePair<String, String> kvp in secDic)
            {
                Console.WriteLine(String.Format("{0}====>{1}", kvp.Key, kvp.Value));
            }
//            output:
//            ak====>av
//            bk====>bv
//            ck====>cv
//            ek====>ev
//----------------------------
//            dk====>dv

            #endregion
            Console.ReadKey();

        }

private static IDictionary<String, String> testDic(IDictionary<String, String> sumDic)
  {
      IDictionary<String, String> secDic = new Dictionary<String, String>();
      String[] keysStr=sumDic.Keys.ToArray<String>();

      for (int i = 0; i < keysStr.Length; i++)
      {
          if (sumDic[keysStr[i]].Equals("dv"))
          {
              secDic.Add(keysStr[i], sumDic[keysStr[i]]);
              sumDic.Remove(keysStr[i]);
          }
      }

      return secDic;
  }


出現的問題:
1、因業務需要更改了幾個關鍵方法,程式沒有報異常,但是有一個方法一直沒有執行,一直很困惑
由於開發環境和生產環境分離,也無法在現網除錯,只能分析程式碼,最後發現問題就在改的方法上,中間的過渡方法執行了另一個操作,但是沒有將值返回,導致向上層傳遞了空Dictionary,雖然沒有報錯,但不滿足另一個方法的執行條件。。。。

 

2、日誌輸出時忽略了一些關鍵資訊,需先規劃好要輸入哪些必要資訊;


3、IDictionary<String, int[]>  陣列作為dic的value時出現的問題:

陣列是引用型別,如果在第二次使用時沒有實始化就重新使用,會影響到以前的值:
有問題的:

       public static void TestDicArray() {
            Dictionary<String, int[]> dic = new Dictionary<String, int[]>();

          int[] valueArray=new int[2];
          valueArray[0] = 1;
          valueArray[1] = 1;

          dic.Add("test1",valueArray);
          //valueArray = new int[2];
          valueArray[0] = 2;
          valueArray[1] = 2;

          dic.Add("test2", valueArray);

          //valueArray = new int[2];
          valueArray[0] = 3;
          valueArray[1] = 3;

          dic.Add("test3", valueArray);

         // valueArray = new int[2];
          valueArray[0] = 4;
          valueArray[1] = 4;

          dic.Add("test4", valueArray);

         // valueArray = new int[2];
          valueArray[0] = 5;
          valueArray[1] = 5;

          dic.Add("test5", valueArray);



          foreach (KeyValuePair<String,int[]> kvp in dic)
          {

              Console.WriteLine(kvp.Key);
              int[] tempInt = kvp.Value;
              Console.WriteLine(tempInt[0]+"\t"+tempInt[1]);

              Console.WriteLine(dic[kvp.Key][0]+"\t"+dic[kvp.Key][1]);

          }
        
        
        }


image

正確的:

       public static void TestDicArray() {
            Dictionary<String, int[]> dic = new Dictionary<String, int[]>();
 
          int[] valueArray=new int[2];
          valueArray[0] = 1;
          valueArray[1] = 1;
 
          dic.Add("test1",valueArray);
          valueArray = new int[2];
          valueArray[0] = 2;
          valueArray[1] = 2;
 
          dic.Add("test2", valueArray);
 
          valueArray = new int[2];
          valueArray[0] = 3;
          valueArray[1] = 3;
 
          dic.Add("test3", valueArray);
 
          valueArray = new int[2];
          valueArray[0] = 4;
          valueArray[1] = 4;
 
          dic.Add("test4", valueArray);
 
          valueArray = new int[2];
          valueArray[0] = 5;
          valueArray[1] = 5;
 
          dic.Add("test5", valueArray);
 
 
 
          foreach (KeyValuePair<String,int[]> kvp in dic)
          {
 
              Console.WriteLine(kvp.Key);
              int[] tempInt = kvp.Value;
              Console.WriteLine(tempInt[0]+"\t"+tempInt[1]);
 
              Console.WriteLine(dic[kvp.Key][0]+"\t"+dic[kvp.Key][1]);
 
          }
        
        
        }


OutPut:

image

                    //input value attribute;InnerText is null
                    HtmlElementCollection hecSelects = hd.GetElementsByTagName("input");
                    foreach (HtmlElement heSelect in hecSelects)
                    {
                        showMsgInText("value:"+heSelect.GetAttribute("value"));
                        showMsgInText("InnerText:" + heSelect.InnerText);
                    }

相關文章