Maha Javed Ответов: 1

Изображения Listview неуместны и иногда исчезают в winform C#


Я работаю над winforms, где у меня есть 2 кода, работающих на одно и то же, и они одинаковы только разница в запросах, но один работает совершенно нормально, а другой имеет проблемы, так как он неправильно помещает изображения. проблема в том, что каждый раз, когда я запускаю код, изображения находятся не в том месте. правильный функциональный код:

int c2 = -1;
List<string> searchpath =new List<string>();
List<string> searchtitle = new List<string>();
listView2.Clear();
homerecipe.Clear();
searchtitle.Clear();
searchpath.Clear();
imageList3.Images.Clear();
var text = textBox1.Text;
char[] separator = { ' ' };
string[] words = null;
words = text.Split(separator);

foreach (string word in words)
{
  try
  {  
    cmd = new SqlCommand($"select Title, Thumbnail,RecipeName from RecipeInfo where RecipeName like '%{word}%'", con);
    
    con.Open();
    SqlDataReader read = cmd.ExecuteReader();
    
    if (read.HasRows)
    {
      while (read.Read())
      {
        // if (homerecipe.Any(item => item == read[2].ToString())) continue;
        searchtitle.Add(read[0].ToString());
        searchpath.Add($@"{read[1].ToString()}");
        homerecipe.Add(read[2].ToString());
      }

      read.Close();
      //con.Close();
      foreach (string ipath in searchpath)
      {
        ListViewItem img = listView2.FindItemWithText(ipath);
        if (img == null)
        {
          imageList3.Images.Add(Image.FromFile(ipath));
        }
      }

      listView2.LargeImageList = imageList3;
      foreach (string hometitle in searchtitle)
      {
        ListViewItem list = listView2.FindItemWithText(hometitle);
        if (list == null)
        {
          c2++;
          listView2.Items.Add(hometitle, c2);
        }
      }
    }
    con.Close();
  }
  catch (SqlException)
  {
  MessageBox.Show("masla");
      con.Close();
      //continue;
  }

Проблемный код:

<pre>int ccc = -1;
hometitles.Clear();
homepaths.Clear();
homerecipe.Clear();
imageList2.Images.Clear();
try
{
  cmd = new SqlCommand("select  Title, Thumbnail,RecipeName from RecipeInfo order by newid()", con); //generating random from sql

  con.Open();
  SqlDataReader reader1 = cmd.ExecuteReader();
  if (reader1.HasRows)
  {
    while (reader1.Read())
    {
      hometitles.Add(reader1[0].ToString());
      homepaths.Add($@"{reader1[1].ToString()}");
      homerecipe.Add(reader1[2].ToString());
    }
  }
  reader1.Close();
  //con.Close();
  
  foreach (string imagepath in homepaths)
  {    
    ListViewItem img = listView2.FindItemWithText(imagepath);

    if (img == null)
    {
      imageList2.Images.Add(Image.FromFile(imagepath));
    }
  }
  listView2.LargeImageList = imageList2;
  foreach (string hometitle in hometitles)
  {
    ListViewItem list = listView2.FindItemWithText(hometitle);
    if (list == null)
    {
      ccc++;
      listView2.Items.Add(hometitle,ccc);
    }
  }
  con.Close();
}
catch(SqlException)
{
    MessageBox.Show("error");
}



Иногда бывает так, что перемешиваются только изображения, иногда и текст, и изображение, но не правильное положение.
Мне очень жаль, что я не знаю, как написать здесь вопрос

Что я уже пробовал:

I have tried using the homerecipe elements as image key as they are primary key but I don't know how to give a condition in foreach that if one name entered then the same name don't come twice. for this, i was trying this

<pre>foreach (string imagepath in homepaths)
{
  foreach(string name in homerecipe) //name a primary key
  {  
    ListViewItem img = listView2.FindItemWithText(imagepath);

    if (img == null)
    {
      MessageBox.Show(name);
      imageList2.Images.Add(name,Image.FromFile(imagepath));  
    }
  }
}

listView2.LargeImageList = imageList2;
foreach (string hometitle in hometitles)
{
  foreach (string name in homerecipe)
  {
    ListViewItem list = listView2.FindItemWithText(hometitle);
    if (list == null)
    {
      ccc++;
      listView2.Items.Add(hometitle, name);
    }
  }
}

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

1 Ответов

Рейтинг:
0

OriginalGriff

Для начала, не делайте этого так: никогда не объединяйте строки для построения SQL-команды. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого всегда используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

Исправьте это через все ваше приложение в качестве очень приоритетного вопроса.


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

Так что все будет зависеть от тебя.
К счастью, у вас есть инструмент, который поможет вам выяснить, что происходит: отладчик. Если вы не знаете, как его использовать, то быстрый Google для "Visual Studio debugger" должен дать вам необходимую информацию.

Поместите точку останова в первую строку функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что то, что вы ожидали, произойдет именно так, как и произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.

Извините, но мы не можем сделать это за вас - пришло время вам освоить новый (и очень, очень полезный) навык: отладку!