2015-09-21 2 views
1

я имею GridView содержит LinkButton как ниже трески в моей ASPX файле:Gridview Выбранная строка возвращения нулевой

<asp:TemplateField> 
    <ItemTemplate> 
     <asp:LinkButton ID="Button3" Style="float: left; margin-left: 10px" 
      CommandArgument='<%# Bind("ID") %>' 
      Text="cancellation" runat="server" CommandName="cancell" OnClick="Button3_Click"> 
        <i aria-hidden="true" class="icon-lock" title="cancellation"></i> 
     </asp:LinkButton> 
    </ItemTemplate> 
</asp:TemplateField> 

Я хочу, когда пользователь нажимает на кнопку ссылки обновить таблицу базы данных, но когда я хочу получить значение ячейки из GridView выбранная строка I сталкивается с исключением null refrence в строке: string barcode = dgvData.SelectedRow.Cells [12] .Text ;.

protected void Button3_Click(object sender, EventArgs e) 
{ 
    Transaction tr = new Transaction(); 
    HasinReservation.Entities.Db.Transaction dt = new Transaction(); 
    SqlConnection connection = new SqlConnection(@"Data Source=192.x.x.x\Sql2008;Initial Catalog=GardeshgariKish;User ID=cms;Password=******;MultipleActiveResultSets=True;Application Name=EntityFramework"); 
    connection.Open(); 
    SqlCommand sqlCmd = new SqlCommand("Update Transactions SET IsCancelled = 1 WHERE BarCodeNumber = @Value", connection); 

    string barcode = dgvData.SelectedRow.Cells[12].Text; 
    sqlCmd.Parameters.AddWithValue("@Value", barcode); 
    //sqlCmd.Parameters.AddWithValue("@Value2", DropDownList2.SelectedItem.Text); 
    sqlCmd.ExecuteNonQuery(); 
    connection.Close(); 
} 
+0

Так какая линия бросает исключение, и то, что вы сделали, чтобы выяснить, почему? –

+0

в этой строке: string barcode = dgvData.SelectedRow.Cells [12] .Text; –

+0

нет, это не так, выбранное свойство строки моего gridview возвращает null. –

ответ

1

Благодарю вас за беспокойство, я нашел его. вот мой отредактированный жерех разметки:

<asp:TemplateField> 
           <ItemTemplate> 
            <asp:LinkButton ID="Button3" Style="float: left; margin-left: 10px" 
             CommandArgument='<%# Bind("ID") %>' 
             Text="cancellation" runat="server" **CommandName="select"** OnClick="Button3_Click"> 
               <i aria-hidden="true" class="icon-lock" title="cancellation"></i> 
            </asp:LinkButton> 
           </ItemTemplate> 
          </asp:TemplateField> 

и вот код позади:

protected void Button3_Click(object sender, EventArgs e) 
     { 
      Transaction tr = new Transaction(); 
      **GridViewRow clickedRow = ((LinkButton)sender).NamingContainer as GridViewRow;** 
      HasinReservation.Entities.Db.Transaction dt = new Transaction(); 
      **int x = clickedRow.RowIndex;** 
      SqlConnection connection = new SqlConnection(@"Data Source=192.X.X.X\Sql2008;Initial Catalog=GardeshgariKish;User ID=cms;Password=XXXXXX;MultipleActiveResultSets=True;Application Name=EntityFramework"); 
      connection.Open(); 
      SqlCommand sqlCmd = new SqlCommand("Update Transactions SET IsCancelled = 1 WHERE BarCodeNumber = @Value", connection); 

      **string barcode = dgvData.Rows[x].Cells[12].Text;** 
      sqlCmd.Parameters.AddWithValue("@Value", barcode); 

      sqlCmd.ExecuteNonQuery(); 
      connection.Close(); 

     } 
2

dgvData.SelectedRow не даст вам строку, с которой была нажата кнопка. Для этого вам нужно NamingContainer. Это должно работать для вас: -

LinkButton Button3 = (LinkButton)sender; 
GridViewRow selectedRow = (GridViewRow)Button3.NamingContainer; 
string barcode = selectedRow.Cells[12].Text; 
2

это потому, что вы не используете выбора-команды

путь должен быть:

  • Добавить RowCommand событие в GridView

    onrowcommand="GridView1_RowCommand" 
    
  • заменить Аргумент команды id с помощью BarCode a d удалить OnClick="Button3_Click"

    <asp:LinkButton ID="Button3" CommandArgument='<%# Bind("BarCode") 
    
  • получить значение

    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) 
    {   
        if (e.CommandName == "cancell") 
        { 
         string barcode = e.CommandArgument; 
        } 
    } 
    
2

Вы можете попробовать этот способ, чтобы получить значение из GridView. Я не пишу весь ваш код, кроме ошибки, содержащей часть.

protected void Button3_Click(object sender, DataGridViewCellEventArgs e) 
{ 
    if (e.RowIndex >= 0) 
    { 
    DataGridViewRow row = this.Rows[e.RowIndex]; 
    string barcode = row.Cells["ID"].Value.ToString();   
    } 
} 

Но что я вижу из вашего кода, что вы используете режим редактирования GridView, но не используете его в своем коде. Пожалуйста, см. Это link для редактирования и обновления строк в GridView в Asp.Net.

1

GridView.SelectedRow свойство будет заполняться строки только тогда, когда вы выбираете строку. Самый простой способ это установить свойство autogenerateselectbutton к true как:

<asp:gridview id="CustomersGridView" autogenerateselectbutton="True" .../> 

Вы должны выполнить следующие шаги последовательно:

  1. Выберите строку, нажав кнопку Select
  2. После этого нажмите кнопку Link , В событии Button Click теперь вы будете иметь выбранную строку как обычно.

Также, dgvData.SelectedRow.Cells[12].Text означает, что ячейка/колонка 12 должна быть BoundField.

Если в колонке 12 Шаблон поля используется метод FindControl() как dgvData.SelectedRow.FindControl("lblBarCode") as Label).Text; предполагающей метка используется для отображения штрих-кода и т.д. ...

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