DataGrid.DataKeyField如何设置多个关键字
我在做删除DataGrid的记录时,由于有多行的数据一样(只有某个字段不一样),而我只想删除所选的一行,该怎么做啊?
能不能做到两行完全一样,选那行的删除就删哪行啊?
[解决办法]
另外你的数据库中如果没有一个ID列的话,那许多操作都不是很好处理。
建议加个标识列
[解决办法]
能不能做到两行完全一样,选那行的删除就删哪行啊?
————————————————
1。
呵呵,你想的美美哦,数据库中两行列字段完全怎么删除呢?这样的数据有意义嘛?
希望,你指的是 复合主键(由两个列以上组成的主键)
2。
DataGrid.DataKeyField 无法设置多个关键字,请选择使用 GridView
GridView.DataKeyNames 可以支持多个关键字
3.
若你 1.x 版本,又是复合主键,希望 DataGrid 能区分行只有变通设置了,如下:
<%@ Page Language= "C# " %>
<%@ Import Namespace= "System.Data " %>
<%-- http://community.csdn.net/Expert/topic/5590/5590070.xml?temp=.2358057 --%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN " "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">
<script runat= "server ">
void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack) {
// 首次加载数据一定要放在 !IsPostBack 内,
// 避免回发的时候再次绑定数据,覆盖复选框状态
LoadProductData();
}
}
void btnSubmit_Click(object sender, EventArgs e)
{
ArrayList selectedProductIdList = new ArrayList();
ArrayList selectedCategoryIdList = new ArrayList();
foreach (DataGridItem item in grdPro.Items) {
CheckBox chkItem = item.FindControl( "chkItem ") as CheckBox;
HtmlInputHidden fldProCat = item.FindControl( "fldProCat ") as HtmlInputHidden;
if (chkItem != null && chkItem.Checked) {
/* NOTE:
* 当然你可以在数据源中添加一个列,此列的值为 ProductId$CategoryId,
* 然后将此列作为键绑定到 DataGrid.DatKeyField ,使用如下代码解析
* string[] strArr = ((string)grdPro.DataKeys[item.ItemIndex]).split( '$ ');
* int productId = int.Parse(strArr[0]);
* int categorytId = int.Parse(strArr[1]);
*/
string[] strArr = fldProCat.Value.Split( '$ ');
selectedProductIdList.Add(int.Parse(strArr[0]));
selectedCategoryIdList.Add(int.Parse(strArr[1]));
// add your more codes
// ...
Response.Write(fldProCat.Value + ", ");
}
}
}
void LoadProductData()
{
grdPro.DataSource = CreateProductTable();
grdPro.DataBind();
}
#region sample data
static DataTable CreateProductTable()
{
DataTable tbl = new DataTable( "Products ");
tbl.Columns.Add( "ProductID ", typeof(int));
tbl.Columns.Add( "ProductName ", typeof(string));
tbl.Columns.Add( "CategoryID ", typeof(int));
DataRow row = tbl.NewRow();
row[0] = 1;
row[1] = "Chai ";
row[2] = 1;
tbl.Rows.Add(row);
row = tbl.NewRow();
row[0] = 2;
row[1] = "Chang ";
row[2] = 1;
tbl.Rows.Add(row);
row = tbl.NewRow();
row[0] = 3;
row[1] = "Aniseed Syrup ";
row[2] = 2;
tbl.Rows.Add(row);
row = tbl.NewRow();
row[0] = 4;
row[1] = "Chef Anton 's Cajun Seasoning ";
row[2] = 2;
tbl.Rows.Add(row);
row = tbl.NewRow();
row[0] = 5;
row[1] = "Chef Anton 's Gumbo Mix ";
row[2] = 2;
tbl.Rows.Add(row);
row = tbl.NewRow();
row[0] = 47;
row[1] = "Zaanse koeken ";
row[2] = 3;
tbl.Rows.Add(row);
row = tbl.NewRow();
row[0] = 48;
row[1] = "Chocolade ";
row[2] = 3;
tbl.Rows.Add(row);
row = tbl.NewRow();
row[0] = 49;
row[1] = "Maxilaku ";
row[2] = 3;
tbl.Rows.Add(row);
return tbl;
}
#endregion
</script>
<html xmlns= "http://www.w3.org/1999/xhtml " >
<head runat= "server ">
<title> DemoN_DataGridCheckBoxCompositeKeys </title>
<script type= "text/javascript ">
// 有可能还包含其他用途的 checkbox,故提供
// 参数 suredId 确保关联的是正确的 checkbox,
function chkAll_Clicked(sender, suredId)
{
var cnt = sender.parentElement.parentElement.parentElement.parentElement;
var nptArr = cnt.getElementsByTagName( "input ");
for(var i = 0; i < nptArr.length; i++) {
if(nptArr[i].type == 'checkbox ' && nptArr[i].id.indexOf(suredId) > -1) {
nptArr[i].checked = sender.checked;
}
}
}
</script>
</head>
<body>
<form id= "form1 " runat= "server ">
<div>
<asp:DataGrid ID= "grdPro " DataKeyField= "ProductID " AutoGenerateColumns= "false " runat= "server ">
<Columns>
<asp:TemplateColumn>
<HeaderTemplate>
<asp:CheckBox ID= "chkCatPro " onclick= "chkAll_Clicked(this, 'chkItem ') " ToolTip= "Check All " runat= "server " Text= "Check All " />
</HeaderTemplate>
<ItemTemplate>
<asp:CheckBox ID= "chkItem " Text= ' <%# Eval( "ProductName ") %> ' runat= "server " />
<input type= "hidden " id= "fldProCat " value= ' <%# Eval( "ProductId ") + "$ " + Eval( "CategoryId ") %> ' runat= "server " />
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:DataGrid>
<asp:Button ID= "btnSubmit " Text= "获取选中信息 " runat= "server " OnClick= "btnSubmit_Click " />
</div>
</form>
</body>
</html>
Hope helpful!
[解决办法]
你的问题有多种解决方案,但你在用代码解决之前,先考虑一下数据库的设计问题
如果你的数据表确实有复合主键,这里推荐方法如下
联合主键的情况怎么在DataGrid中利用DataKeys定位记录?
http://www.cnblogs.com/lovecherry/archive/2005/04/19/140319.html