foreach плохо читает.потомки и переходит к оператору else перед if

#c# #xml #wpf

#c# #xml #wpf

Вопрос:

Я все еще учусь в терминах C#

В настоящее время я работаю над системой фильтрации и имею список операторов if, который запрещает пользователю выполнять какие-либо действия. Теперь, когда всякий раз, когда пользователь отправляет идентификатор, мой foreach должен проходить по списку уже отправленных идентификаторов, проверяя, существуют ли они уже или нет.

Ошибка заключается в том, что когда пользователь отправляет уже существующий идентификатор, он не увидит существующий идентификатор при первом запуске, поэтому он создаст и заполнит узел, но при втором запуске он отправляет сообщение об ошибке и прерывает сеанс.

Мой код:

 private async void btnAddId_Click(object sender, RoutedEventArgs e)
        {
            XmlDocument Xdoc = new XmlDocument();
            Xdoc.Load(xmldoc);
            XmlNode NodeEl = Xdoc.SelectSingleNode("root/filter/filter_item");
            XmlNode NodeList = Xdoc.SelectSingleNode("root/filter");

            var root = XDocument.Load(xmldoc).Root;
            var filter = root.Element("filter");
            int parsedValue;

            foreach (var f in filter.Descendants())
            {
                if (f.Value == tbAddId.Text)
                {
                    MessageBox.Show("Value already exists in the orderlist!");
                }
                else if (!int.TryParse(tbAddId.Text, out parsedValue))
                {
                    MessageBox.Show("Input isn't numeric!");
                }
                else if (tbAddId.Text == "")
                {
                    MessageBox.Show("No value was given!");
                }
                else if (tbAddId.Text == "Add ID")
                {
                    MessageBox.Show("No value was given!");
                }
                else if (NodeList.InnerText == "")
                {
                    NodeEl.InnerText = tbAddId.Text;
                    tbAddId.Text = "Add ID";
                    tbAddId.Foreground = Brushes.Gray;
                    await api.config_Load();
                    await api.Page_Load();
                }
                else
                {
                    XmlNode filterItem = Xdoc.CreateElement("filter_item");
                    NodeList.AppendChild(filterItem);
                    filterItem.InnerText = tbAddId.Text;
                }

                tbOrderDisplay.Text  = f.Value   " ";
            }         

            Xdoc.Save(xmldoc);
        }
 

Содержимое XML

 <?xml version="1.0"?>
<root>
  <bol_client_id></bol_client_id>
  <!--- this is the client id-->
  <bol_client_secret></bol_client_secret>
  <!-- this is the client secret -->
  <customer_id></customer_id>
  <company_phone></company_phone>
  <auth_token_url></auth_token_url>
  <bol_orders_url></bol_orders_url>
  <debug_mode>true</debug_mode>
  <filter>
    <filter_item>1172828940</filter_item>
    <filter_item>1173700637</filter_item>
  </filter>
</root>
 

Комментарии:

1. Ofc, я отредактирую его в

Ответ №1:

Проверьте, существует ли значение, прежде чем пытаться его вставить:

 private async void btnAddId_Click(object sender, RoutedEventArgs e)
{
    XmlDocument Xdoc = new XmlDocument();
    Xdoc.Load(xmldoc);
    XmlNode NodeEl = Xdoc.SelectSingleNode("root/filter/filter_item");
    XmlNode NodeList = Xdoc.SelectSingleNode("root/filter");

    var root = XDocument.Load(xmldoc).Root;
    var filter = root.Element("filter");
    int parsedValue;

    //1. Check for duplicates
    foreach (var f in filter.Descendants())
    {
        if (f.Value == tbAddId.Text)
        {
            MessageBox.Show("Value already exists in the orderlist!");
            tbOrderDisplay.Text  = f.Value   " ";
            return;
        }
    }

    //2. Validate and insert
    if (!int.TryParse(tbAddId.Text, out parsedValue))
    {
        MessageBox.Show("Input isn't numeric!");
    }
    else if (tbAddId.Text == "")
    {
        MessageBox.Show("No value was given!");
    }
    else if (tbAddId.Text == "Add ID")
    {
        MessageBox.Show("No value was given!");
    }
    else if (NodeList.InnerText == "")
    {
        NodeEl.InnerText = tbAddId.Text;
        tbAddId.Text = "Add ID";
        tbAddId.Foreground = Brushes.Gray;
        await api.config_Load();
        await api.Page_Load();
    }
    else
    {
        XmlNode filterItem = Xdoc.CreateElement("filter_item");
        NodeList.AppendChild(filterItem);
        filterItem.InnerText = tbAddId.Text;
    }

    Xdoc.Save(xmldoc);
}