Намерете стойността в 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();
        }
    }

Показване на ID на студент в 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)) …, постави ли точка на прекъсване там и провери ли стойностите? С други думи, АКО идентификаторът Е в GridView2, ТОГАВА... това също ли е текущият Session[“UserName”]? Очевидно, ако те са едни и същи и не се поставя етикетът „Вие сте гласували преди“… тогава се случва нещо друго. Може ли да се провери, че когато стойностите са еднакви, това пада до частта else на оператора if? ИЛИ е възможно label1.Text да се настрои на нещо друго след този код?   -  person JohnG    schedule 20.10.2020
comment
Когато потребителят влезе като 1909404, тогава сесията [UserName] вече ще съхранява 1909404, когато 1909404 се опита да гласува за втори път, ще се покаже съобщението за грешка, за което сте гласували преди. Но за потребителя 1909362 съобщението за грешка няма да се покаже, въпреки че използванията вече са гласували. Чудя се защо работи с 1909404, но не и с 1909362. Дали е заради Label lblID = (Label)GridView2.Rows[0].FindControl(lblVoter); ?   -  person Kekw Yc    schedule 20.10.2020
comment
Проверихте ли стойностите, както описах по-рано? Може да работи за 1909404, защото стойностите са същите. В MAY не работи за 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 и завършване на цикъла за всеки. Ако „ИЗЛЕЗЕТЕ“ от цикъла 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