Найдите значение в gridview, используя findcontrol, и сравните его с данными в базе данных.

 protected void LinkButton_Click(Object sender, EventArgs e)
    {
        String MyConnection2 = "Server=localhost;database=ovs;Uid=root;password=; Convert Zero Datetime=True";
        DateTime time = DateTime.Now;              // Use current time
        string format = "yyyy-MM-dd HH:mm:ss";
        string UserName4 = HttpContext.Current.User.Identity.Name;
        GridViewRow grdrow = (GridViewRow)((LinkButton)sender).NamingContainer;
        Label lblStudentId = (Label)grdrow.Cells[0].FindControl("lblID");
        string studentId = lblStudentId.Text;
        String query = "insert into voting (CandidateStudentID,voterStudentID,DateTime)values ('" + lblStudentId.Text + "','" + Session["UserName"].ToString() + "','" + time.ToString(format) + "')";
        foreach (GridViewRow row in GridView2.Rows)
        {
            Label lblVoter = row.FindControl("lblVoter") as Label;
            string voterID = lblVoter.Text;


            if (Session["UserName"].ToString().Equals(lblVoter.Text))
            {
                Label1.Text = "You voted before";

            }

        }
        MySqlConnection MyConn2 = new MySqlConnection(MyConnection2);
        MySqlCommand MyCommand2 = new MySqlCommand(query, MyConn2);
        MySqlDataReader MyReader2;
        MyConn2.Open();
        MyReader2 = MyCommand2.ExecuteReader();
        Label2.Text = "Thank you for You Vote";

    }


  <asp:GridView ID="GridView2" runat="server"  AutoGenerateColumns="False" Font-Size="Medium">
          <Columns>
          <asp:TemplateField HeaderText="Student ID">
  <ItemTemplate>
     <asp:Label ID="lblVoter" runat="server"   Width="150px"  Text='<%#Eval("voterStudentID") %>'/>
 </ItemTemplate>
 </asp:TemplateField>
              
          </Columns>
       </asp:GridView>


 protected void loadCandidate()
    {
        con.Open();
        MySqlCommand cmd = new MySqlCommand("select studentID ,name from candidate  ", con);
        MySqlDataReader dr = cmd.ExecuteReader();
        if (dr.HasRows == true)
        {
            GridView1.DataSource = dr;
            GridView1.DataBind();
            con.Close();

            con.Open();
            MySqlCommand cmd2 = new MySqlCommand("select voterStudentID from voting  ", con);
            MySqlDataReader dr2 = cmd2.ExecuteReader();

            GridView2.DataSource = dr2;
            GridView2.DataBind();
        }
    }

отображение идентификатора учащегося в gridview2

Я хочу предотвратить дублирование голосования в базе данных. Теперь я столкнулся с проблемой, когда пользователь входит в систему как первый пользователь в таблице StudentID, которая равна 1909404, когда 1909404 уже существует в базе данных, отображается сообщение об ошибке. Но когда пользователь входит в систему как второй пользователь в таблице StudentID, которая равна 1909362, даже если идентификатор пользователя уже существует, сообщение об ошибке не отображается. Я хотел бы показать сообщение об ошибке, пока идентификатор пользователя существует в базе данных (что означает, что они проголосовали раньше).


person Kekw Yc    schedule 20.10.2020    source источник
comment
Как GridView2 получает данные и как часто они обновляются?   -  person JohnG    schedule 20.10.2020
comment
Здравствуйте, я обновил свой код о том, как gridview2 получает данные. Gridview2 будет обновляться каждый раз, когда пользователь нажимает кнопку голосования.   -  person Kekw Yc    schedule 20.10.2020
comment
Ну… вроде понятно, что проблема в строке… if (Session["UserName"].ToString().Equals(lblID.Text)) … , ты там точку останова поставил и проверил значения? Другими словами, ЕСЛИ ID НАХОДИТСЯ в GridView2, ТО... это также текущий Session[“UserName”]? Очевидно, что если они одинаковые и это не ставит метку «Вы голосовали раньше»… тогда происходит что-то еще. Можно ли проверить, что, когда значения совпадают, они переходят к части else оператора if? ИЛИ label1.Text может быть установлено что-то еще после этого кода?   -  person JohnG    schedule 20.10.2020
comment
Когда пользователь входит в систему как 1909404, тогда Session[UserName] теперь будет хранить 1909404, когда он 1909404 попытается проголосовать во второй раз, будет показано сообщение об ошибке, за которое вы голосовали ранее. Но для пользователя 1909362 сообщение об ошибке не будет отображаться, даже если пользователи уже проголосовали. Интересно, почему это работает с 1909404, но не с 1909362. Это из-за Label lblID = (Label)GridView2.Rows[0].FindControl(lblVoter); ?   -  person Kekw Yc    schedule 20.10.2020
comment
Вы проверили значения, как я описал ранее? Это может работать для 1909404, потому что значения одинаковы. В МОЖЕТ не работать для 1909362, потому что значения НЕ совпадают. Похоже, вы не проверяете это, кроме окончательного результата. Поставьте точку останова, как описано ранее, и ПРОВЕРЬТЕ значения.   -  person JohnG    schedule 20.10.2020
comment
Извините, что не ответил вам, когда вы попросили меня проверить значение. Я поставил точку останова, чтобы изучить его. Когда пользователь входит в систему как 1909362, значение в label1.Text по-прежнему равно 1909404, поэтому сообщение об ошибке не отображается.   -  person Kekw Yc    schedule 20.10.2020
comment
Похоже, вы поняли. И это звучит правильно, вам нужно будет перебрать ВСЕ строки в GridView2, чтобы определить, находится ли текущий пользователь в сетке.   -  person JohnG    schedule 20.10.2020
comment
Как я сказал в своем последнем комментарии… вам нужно перебрать ВСЕ строки в GridView2, чтобы определить, равно ли Session[“UserName”] одной из строк в сетке. В настоящее время код смотрит ТОЛЬКО на первую строку… Label lblID = (Label)GridView2.Rows[0].FindControl("lblVoter"); Вот почему числа не совпадают во втором числе. Ваш код должен перебирать ВСЕ строки, и если он НЕ найден, они могут голосовать. Очевидно, что если имя найдено, вы можете выйти из цикла и опубликовать «сообщение, за которое вы проголосовали».   -  person JohnG    schedule 20.10.2020
comment
Ваше обновление не будет работать должным образом. В цикле foreach... Вы только хотите проверить, равен ли идентификатор одному из идентификаторов в GridView2. ЕСЛИ совпадение найдено, просто опубликуйте сообщение, за которое вы проголосовали, и вернитесь... больше ничего не нужно. Однако, если вы выйдете из цикла foreach, а код НЕ вернётся… тогда они смогут проголосовать. То есть… foreach (row in grid2) if (names are equal) then post can’t vote message and exit… Оператор else не требуется и завершает цикл for каждого. Если вы «ВЫХОДИТЕ» из цикла foreach, это означает, что имя НЕ было найдено… тогда они могут голосовать.   -  person JohnG    schedule 20.10.2020
comment
Что означает, что мне не нужно правильно указывать оператор else? Могу ли я узнать, где я должен поместить команду для выполнения запроса на вставку и успешного сообщения? Я попытался удалить оператор else и поместить запрос на вставку и успешное сообщение за пределы foreach, он также показывает ту же ошибку, которая одновременно отображает ошибку и успешное сообщение и вставляет дубликат studentID в базу данных.   -  person Kekw Yc    schedule 20.10.2020


Ответы (1)


Меняй так....

foreach (GridViewRow row in GridView2.Rows) {
  Label lblVoter = row.FindControl("lblVoter") as Label;
  if (Session["UserName"].ToString().Equals(lblVoter.Text)) {
    Label1.Text = "You voted before";
    return;
  }
}
// Since we looped through all the rows and did NOT find a match...
// Then they can vote 
MySqlConnection MyConn2 = new MySqlConnection(MyConnection2);
MySqlCommand MyCommand2 = new MySqlCommand(query, MyConn2);
MySqlDataReader MyReader2;
MyConn2.Open();
MyReader2 = MyCommand2.ExecuteReader();
Label2.Text = "Thank you for You Vote";
person JohnG    schedule 20.10.2020
comment
МОЙ БОГ! Это работает! Большое спасибо, что потратили свое время на то, чтобы направлять меня и научить меня, как решить ошибку. Я очень ценю это! - person Kekw Yc; 20.10.2020
comment
@Kekw Yc ... Рад, что у тебя все получилось. Последний момент, который вы должны решить, в строке запроса, вы должны ВСЕГДА параметризовать свои запросы. Несмотря на то, что вы используете в запросе Label... lblStudentId.Text, МУДРО иметь привычку параметризовать почти все из «внешнего» мира, которое используется в качестве строки в запросе. - person JohnG; 20.10.2020
comment
Отметил с благодарностью! Постараюсь улучшить текущий код с вашим предложением! - person Kekw Yc; 20.10.2020