2017-12-17 17 views
0

응용 프로그램은 항목을 데이터베이스로 작동하여 XML 문서에 씁니다. 이러한 항목은 DataGridview에 행으로 표시됩니다. 각 "입력"노드에는 "entryno"속성이 있습니다. 항목이 삭제 될 때마다이 "entryno"번호 매기기 순서가 끊어집니다. 위의 코드를 작성하는 동안 "entryno"를 증가시키기위한 코드를 구현할 수 있었지만 위의 코드를 시도하는 동안 좋은 결과를 얻지 못했습니다.항목을 삭제 한 후 모든 "entryno"속성의 번호 순서를 다시 설정하십시오.

private void Deletbtn_Click(object sender, EventArgs e) 
    { 
     XmlNode node = doc.SelectSingleNode("//entry[@entryno='" +  Dgv.CurrentRow.Cells[0].Value + "']"); 

     try 
     { 
      if (node != null && Dgv.CurrentRow.Selected == true) 
      { 
       doc.DocumentElement.RemoveChild(node); 

       // Trying to refresh the sequence each time an node is deleted. 
       int Attrno = int.Parse(doc.SelectSingleNode("//entry[@entryno]").Value); 
       do 
       { 
        Attrno = 0; 
        Attrno++; 
       } while (Attrno < doc.ChildNodes.Count); 
       doc.SelectSingleNode("//entry[@entryno]").InnerText = Attrno.ToString(); 

       doc.Save(Application.StartupPath + @"\SleepRecords.xml"); 
      } 
      else 
       MessageBox.Show("Click the left side of the grid to select a row to delete.", "Select row", MessageBoxButtons.OK, MessageBoxIcon.Information); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
     } 
     ReloadData(); 
     Resetbtn_Click(Deletbtn, e); 
     makePdf(); 
    } 

FYI, 이것은 내가 작성한 각 새 항목 (관련 코드 조각)에서 "entryno"속성을 증가시키는 방법입니다.

   XmlNodeList nodes = doc.SelectNodes("//entry"); 
      int max = 0; 
      foreach (XmlNode node in nodes) 
      { 
       int nodeAttr = int.Parse(node.Attributes["entryno"].Value); 
       max = nodeAttr; 
      } 
      max++; 

항목 데이터를 저장하는 Xml 문서. DataGridview는 여기에서 정보를 가져옵니다.

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<!-- These are the entries --> 
<entries> 
    <entry entryno="1"> 
    <weekday>Saturday</weekday> 
    <date>16/12/2017</date> 
    <time>21:42</time> 
    <action>Out of bed</action> 
    <mind>Ok</mind> 
    <body>Ok</body> 
    </entry> 
    <entry entryno="2"> 
    <weekday>Sunday</weekday> 
    <date>17/12/2017</date> 
    <time>02:56</time> 
    <action>Awake in bed</action> 
    <mind>Ok</mind> 
    <body>Ok</body> 
    </entry> 
    <entry entryno="3"> 
    <weekday>Sunday</weekday> 
    <date>17/12/2017</date> 
    <time>03:07</time> 
    <action>Awakening</action> 
    <mind>Ok</mind> 
    <body>Ok</body> 
    </entry> 
    <entry entryno="4"> 
    <weekday>Sunday</weekday> 
    <date>17/12/2017</date> 
    <time>03:18</time> 
    <action>Awakening</action> 
    <mind>Ok</mind> 
    <body>Ok</body> 
    </entry> 
    <entry entryno="5"> 
    <weekday>Sunday</weekday> 
    <date>17/12/2017</date> 
    <time>03:38</time> 
    <action>Out of bed</action> 
    <mind>Ok</mind> 
    <body>Ok</body> 
    </entry> 
</entries> 

도움 주셔서 감사합니다.

답변

0

간단한 사용하여 XML LINQ는 :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      XDocument doc = XDocument.Load(FILENAME); 

      int count = 1; 
      foreach (XElement entry in doc.Descendants("entry")) 
      { 
       entry.SetAttributeValue("entryno", count++); 
      } 
     } 
    } 
} 
+0

나는 카운트 정수 속성 값도 "entryno"문자열을 구문 분석 후 Deletebtn_Click 이벤트하지만 성공하지 솔루션을 구현하기 위해 노력했다. 다행히도 코드가 모든 "entryno"속성 문자열을 정수로 변환해야 정수 정수를 증가시키고 각각에 대한 반복의 문자열 값 (문자열로 다시 변환)을 반환 할 수 있습니다. 속성. 결과 문자열을 증가시키기 전에 특성 문자열을 구문 분석 한 다음 속성 값으로 할당 할 문자열로 다시 변환해야합니다. TY. – Diezus

+0

나는 복잡 할 필요가없는 것을 복잡하게 만들고있었습니다. 당신의 해결책은 정확했습니다. 감사. – Diezus