2016-08-02 137 views
0

我有多次的DataKeyNames GridView中(這是因爲在數據庫中沒有PK):更新在GridView中單列多的DataKeyNames

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
    DataSourceID="SqlDataSource1" DataKeyNames = "id,group,sto,busn" 
    onrowcommand="Add_RowCommand" onrowupdating="GridView1_RowUpdating" > 

當行更新,我想只有該行通過將原始值存儲在字符串中並在where子句中使用它來嘗試這樣做。我在SQL Server Management Server中測試了它,它運行良好。

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e) 
    { 
     string connectionString = ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString; 
     SqlConnection conn = new SqlConnection(connectionString); 
     TextBox id = (TextBox)rowIndex.FindControl("idTB"); 
     string old_id = e.OldValues["ID"].ToString(); 
     TextBox first_name = (TextBox)rowIndex.FindControl("fnameTB"); 
     TextBox last_name= (TextBox)rowIndex.FindControl("lnameTB"); 
     DropDownList group =(DropDownList)rowIndex.FindControl("groupDDL"); 
     string old_group= e.OldValues["Group"].ToString(); 
     TextBox sto= (TextBox)rowIndex.FindControl("stoTB"); 
     string old_sto= e.OldValues["Sto"].ToString(); 
     DropDownList busn= (DropDownList)rowIndex.FindControl("buDDL"); 
     string old_busn= e.OldValues["Busn"].ToString(); 

     SqlCommand cmd = new SqlCommand(); 
     cmd.CommandText = "UPDATE tablename SET id= @id, first_name= @first_name, last_name= @last_name, group= @group, sto= @sto, busn= @busn, WHERE id= @old_id AND group = @old_group AND (sto = @old_sto OR (@sto is null and sto is null)) AND busn = @old_busn"; 

     cmd.Parameters.AddWithValue("@id", id.Text); 
     cmd.Parameters.AddWithValue("@old_id", old_id); 
     cmd.Parameters.AddWithValue("@first_name", first_name.Text); 
     cmd.Parameters.AddWithValue("@last_name", last_name.Text); 
     cmd.Parameters.AddWithValue("@group", group.SelectedValue); 
     cmd.Parameters.AddWithValue("@old_group", old_group); 
     cmd.Parameters.AddWithValue("@sto", CheckGroupingCode(sto.Text)); 
     cmd.Parameters.AddWithValue("@old_sto", old_sto); 
     cmd.Parameters.AddWithValue("@busn", busn.SelectedValue); 
     cmd.Parameters.AddWithValue("@old_busn", old_busn); 

     cmd.Connection = conn; 
     conn.Open(); 
     cmd.ExecuteNonQuery(); 
     conn.Close(); 

     Response.Redirect("tablename.aspx"); 

    } 

更新:問題是我的OldValues回來爲空。

+0

'(STO = @old_sto OR(@sto是零和STO爲null))'什麼是它的目的 – jonju

+0

申通爲空 – a1yx

+0

'( sto = @old_sto或@sto IS NULL)'。我認爲這是正確的方法 – jonju

回答

1

檢索DataKey值

string values = GridView1.DataKeys[e.RowIndex].Value.ToString(); 

現在

values ="id,group,sto,busn"; //this is no code..showing what `values` will actually look like; 

現在被他們用,(逗號)來獲取個人價值

string[] valueArr = values.Split(','); 

var old_id = valueArr[0]; 
var old_group= valueArr[1]; 
var old_sto= valueArr[2]; 
var old_busn= valueArr[3]; 

然後你可以在使用它查詢。

+0

這是非常有用的謝謝,但我不斷收到IndexOutOfBounds錯誤。我會發布解決方案,但+1,因爲這有很大幫助。謝謝! – a1yx

+0

因爲我需要從這一行看到'values'的真實內容'string values = GridView1.DataKeys [e.RowIndex] .Value.ToString();' – jonju

0
string old_id = GridView1.DataKeys[e.RowIndex].Values[0].ToString(); 
string old_group = GridView1.DataKeys[e.RowIndex].Values[1].ToString(); 
int old_sto = Convert.ToInt32(GridView1.DataKeys[e.RowIndex].Values[2]); 
string old_busn = GridView1.DataKeys[e.RowIndex].Values[3].ToString(); 

^會得到以前的值,並只更改一行