2015-04-09 5 views
0

Я работаю с Asp.Net C# и хочу взять идентификатор строки с флажком из GridView. С выше кодой, если проверяются только думает, я получаю с отладкой является:CheckBox не работает, когда я нажимаю кнопку

chk: {Text = "" Checked = false}

Что я делаю неправильно и как я могу это исправить?

<!-- language: lang-css --> 
    protected void Page_Load(object sender, EventArgs e) 
     { 
      string query = "SELECT * FROM routedoc WHERE [email protected] "; 

      string user = Session["user"].ToString(); 
      MySqlConnection con = new MySqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["imagingConnectionString"].ConnectionString); 
      MySqlCommand cmd = new MySqlCommand(query, con); 
      cmd.Parameters.AddWithValue("@user", user); 
      con.Open(); 
      DataTable dataTable = new DataTable(); 
      MySqlDataAdapter da = new MySqlDataAdapter(cmd); 

      da.Fill(dataTable); 


      GridView1.DataSource = dataTable; 
      GridView1.DataBind(); 

      if(!IsPostBack) 
      { 

       BindDropDown(); 

      } 
     } 
private void BindDropDown() 
     { 
      string user = Session["user"].ToString(); 
      using (MySqlConnection con2 = new MySqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["imagingConnectionString"].ConnectionString)) 
      { 


       MySqlDataAdapter adp = new MySqlDataAdapter("SELECT RouteNo,sender FROM routedoc WHERE Recipient = @user ", con2); 
       adp.SelectCommand.Parameters.AddWithValue("?user", user); 
       DataTable dt = new DataTable(); 
       adp.Fill(dt); 
       if (dt.Rows.Count > 0) 
       { 
        DropDownList1.DataSource = dt; 
        DropDownList1.DataTextField = "sender"; 
        DropDownList1.DataValueField = "RouteNo"; 
        DropDownList1.DataBind(); 
       } 

      } 

     } 
protected void Button1_Click(object sender, EventArgs e) 
    { 

     // Response.Write(GridView1.SelectedRow.Cells[1].Text); 

     foreach(GridViewRow row in GridView1.Rows) 
     { 
      var chk = row.FindControl("box") as CheckBox ; 
      if (chk.Checked) 
      { 
       var id = row.FindControl("RouteNo") as Label; 
       Response.Write(id.Text); 
      } 

     } 
    } 

routedoc.aspx:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="routedoc.aspx.cs" Inherits="WebApplication2.WebForm2" %> 

<!DOCTYPE html> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
    <h1>page 2<asp:DropDownList ID="DropDownList1" runat="server" Height="20px" AutoPostBack="True" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged" Width="136px" > 
     </asp:DropDownList> 
     </h1> 

    </div> 
     <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="Recipient,DocHandle,Sender" OnSelectedIndexChanged="GridView1_SelectedIndexChanged" > 
      <Columns> 
       <asp:BoundField DataField="RouteNo" HeaderText="RouteNo" InsertVisible="False" SortExpression="RouteNo" /> 
       <asp:BoundField DataField="Recipient" HeaderText="Recipient" ReadOnly="True" SortExpression="Recipient" /> 
       <asp:BoundField DataField="DocHandle" HeaderText="DocHandle" ReadOnly="True" SortExpression="DocHandle" /> 
       <asp:BoundField DataField="Sender" HeaderText="Sender" ReadOnly="True" SortExpression="Sender" /> 
       <asp:BoundField DataField="TermNo" HeaderText="TermNo" SortExpression="TermNo" /> 
       <asp:BoundField DataField="SentDate" HeaderText="SentDate" SortExpression="SentDate" /> 
       <asp:BoundField DataField="DueDate" HeaderText="DueDate" SortExpression="DueDate" /> 
       <asp:BoundField DataField="SentTime" HeaderText="SentTime" SortExpression="SentTime" /> 
       <asp:BoundField DataField="DueTime" HeaderText="DueTime" SortExpression="DueTime" /> 
       <asp:BoundField DataField="Action" HeaderText="Action" SortExpression="Action" /> 
       <asp:BoundField DataField="Notes" HeaderText="Notes" SortExpression="Notes" /> 
       <asp:BoundField DataField="BUDate" HeaderText="BUDate" SortExpression="BUDate" /> 
<asp:TemplateField HeaderText="Select"> 
    <ItemTemplate><asp:CheckBox ID="Box" runat="server"/> 
    </ItemTemplate></asp:TemplateField> 
      </Columns> 

     </asp:GridView> 

     <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:imagingConnectionString %>" ProviderName="<%$ ConnectionStrings:imagingConnectionString.ProviderName %>" SelectCommand="SELECT * FROM routedoc "></asp:SqlDataSource> 
     <asp:Button ID="Button1" runat="server" Height="43px" OnClick="Button1_Click" Text="DELETE" Width="109px" /> 
    </form> 
</body> 
</html> 
+0

Что такое 'RouteId' здесь? Я не могу найти это в вашем разметке. –

+0

@marios: Даже я не вижу здесь 'RouteId', я думаю, это должен быть« Box »в вашем коде cs. – BNN

+0

Извините, что это должен быть RouteNo, я обновлю вопрос – marios

ответ

1

Это вызвано тем, что вы всегда связывать свои GridView1 с данными, даже на пост-обратно. Это приводит к отключению всех флажков.

Удалите загрузку сетки, если вы находитесь в состоянии обратной связи, и она должна работать нормально.

protected void Page_Load(object sender, EventArgs e) 
{       
    if (!Page.IsPostBack) 
    { 
     string query = "SELECT * FROM routedoc WHERE [email protected] "; 

     string user = Session["user"].ToString(); 
     MySqlConnection con = new MySqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["imagingConnectionString"].ConnectionString); 
     MySqlCommand cmd = new MySqlCommand(query, con); 
     cmd.Parameters.AddWithValue("@user", user); 
     con.Open(); 
     DataTable dataTable = new DataTable(); 
     MySqlDataAdapter da = new MySqlDataAdapter(cmd); 
     da.Fill(dataTable); 

     GridView1.DataSource = dataTable; 
     GridView1.DataBind(); 
     BindDropDown(); 
    } 
} 

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

+0

Я обновил свой вопрос с помощью моего кода в page_load – marios

+0

См. Мой обновленный ответ ... – Dusan

+0

Я попробовал ваш код и теперь идет в chk.checked, но я получаю null на id. Почему? – marios

1

Всякий раз, когда вы связываете данные для управления данными в Page_Load случае, пожалуйста, рассмотреть вопрос об использовании Page.IsPostBack

protected void Page_Load(object sender, EventArgs e) 
{       
    if(!Page.IsPostBack) 
    { 
     // bind data 
    } 
} 

Это происходит потому, что при нажатии на кнопку, ваша страница будет по-прежнему обновляется, а значит, вы будете связывать те же данные в gridview снова, в результате чего отмечены флажки без отметки. Вы можете проверить, загружена ли страница нажатием кнопки (Page.IsPostBack), или страница загружается в первый раз (!Page.IsPostBack) и соответственно связывает ваши данные.

Надеюсь, что это имеет смысл!

+0

Я обновил свой вопрос с помощью моего кода в page_load – marios

+0

, вам нужно переместить раздел, начинающийся с этой строки query = "SELECT * FROM routedoc WHERE Recipient = @ user"; 'in' if (! Page.IsPostBack) 'block – renakre

+0

Прохладный, я понял. Но знаете, почему я получаю null на id внутри оператора if? – marios

Смежные вопросы