To work with Insert and Update statement you need to check the ProductId with each row exist in grid with ProductId column value from first column.
For insert you just need to check the selected dropdown value with grid exist product values.
For update you need to maintain the current updated record value in any hidden field when you are editing the grid row from user interface same way you need to have ProductId value of editing row to hidden field.
And in script you just need to check hidden field value not with the selected dropdown value also selected dropdown value not exist already in gridview so it will handle the editing row as well as the duplicate row case.
You just need to set hiddenfield value on your edit method so you need to set ProductId value and on submit click when your row get added to datatable just make it empty.
Add the hidden field in your html sets its value in edit and clear it on submit as suggested.
<asp:HiddenField ID="hfProductId" runat="server" Value="2" />
Also Add the OnClientClick event with the Javascript method to check the duplicate record.
<asp:Button ID="btnInsert" runat="server" Text="Insert" OnClick="btnInsert_Click"
class="btn btn-primary" TabIndex="11" ValidationGroup="Mastergroup1" OnClientClick="return CheckDuplicateRecord()" />
SCRIPT
<script type="text/javascript">
function CheckDuplicateRecord() {
var btnInsertorUpdate = document.getElementById("<%=btnInsert.ClientID %>");
var hfProductId = document.getElementById("<%=hfProductId.ClientID %>");
var grdDetails = document.getElementById("<%=GrdDetails.ClientID %>");
var ddlProduct = document.getElementById("<%=ddlProduct.ClientID %>");
var selectedProduct = ddlProduct.value;
var isDuplicate = false;
if (grdDetails != null) {
var rows = grdDetails.getElementsByTagName("tr");
for (var i = 0; i < rows.length; i++) {
if (rows[i].getElementsByTagName("td").length > 0) {
if (rows[i].getElementsByTagName("td")[0].innerHTML !=" " && (rows[i].getElementsByTagName("td")[0].innerHTML == selectedProduct && btnInsertorUpdate.value.toUpperCase() == "INSERT")
|| (btnInsertorUpdate.value.toUpperCase() == "UPDATE" && rows[i].getElementsByTagName("td")[0].innerHTML != hfProductId.value && rows[i].getElementsByTagName("td")[0].innerHTML == selectedProduct))
{
alert("Product Details Already exists");
isDuplicate = true;
break;
}
}
}
}
if (isDuplicate) {
return false;
}
}
</script>
Clear the hiddenfield on Insert Event.
C#
protected void btnInsert_Click(object sender, EventArgs e)
{
try
{
if (IsValid)
{
DataSet ds = new DataSet();
if (ViewState["SalesDetail"] != null)
{
DataSet dtCurrentTable = (DataSet)ViewState["SalesDetail"];
string[] arr = ddlProduct.SelectedValue.Split('-');
productid = arr[0];
if (btnInsert.Text.Equals("Insert"))
{
DataRow drCurrentRow = null;
drCurrentRow = dtCurrentTable.Tables[0].NewRow();
drCurrentRow["ProductID"] = productid;
drCurrentRow["ProductName"] = ddlProduct.SelectedItem.Text;
drCurrentRow["UnitID"] = ddlUnit.SelectedValue;
drCurrentRow["UnitName"] = ddlUnit.SelectedItem.Text;
drCurrentRow["ProductMRP"] = Convert.ToDouble(txtProductMRP.Text).ToString();
drCurrentRow["ProductRate"] = Convert.ToDouble(txtProductRate.Text).ToString();
drCurrentRow["ProductQty"] = txtProductQty.Text;
drCurrentRow["ProductAmt"] = Convert.ToDouble(txtProductAmt.Text).ToString();
drCurrentRow["DiscRate"] = Convert.ToDouble(txtProductDiscRate.Text).ToString();
drCurrentRow["DiscAmt"] = Convert.ToDouble(txtProductDiscAmt.Text).ToString();
drCurrentRow["ProductNetAmt"] = Convert.ToDouble(txtProductNetAmt.Text).ToString();
dtCurrentTable.Tables[0].Rows.Add(drCurrentRow);
}
else if (btnInsert.Text.Equals("Update"))
{
DataRow drCurrentRow = null;
drCurrentRow = dtCurrentTable.Tables[0].NewRow();
dtCurrentTable.Tables[0].Rows[GrdDetails.SelectedIndex]["ProductID"] = productid;
dtCurrentTable.Tables[0].Rows[GrdDetails.SelectedIndex]["ProductName"] = ddlProduct.SelectedItem.Text;
dtCurrentTable.Tables[0].Rows[GrdDetails.SelectedIndex]["UnitID"] = ddlUnit.SelectedValue;
dtCurrentTable.Tables[0].Rows[GrdDetails.SelectedIndex]["UnitName"] = ddlUnit.SelectedItem.Text;
dtCurrentTable.Tables[0].Rows[GrdDetails.SelectedIndex]["ProductMRP"] = Convert.ToDouble(txtProductMRP.Text).ToString();
dtCurrentTable.Tables[0].Rows[GrdDetails.SelectedIndex]["ProductRate"] = Convert.ToDouble(txtProductRate.Text).ToString();
dtCurrentTable.Tables[0].Rows[GrdDetails.SelectedIndex]["ProductQty"] = txtProductQty.Text;
dtCurrentTable.Tables[0].Rows[GrdDetails.SelectedIndex]["ProductAmt"] = Convert.ToDouble(txtProductAmt.Text).ToString();
dtCurrentTable.Tables[0].Rows[GrdDetails.SelectedIndex]["DiscRate"] = Convert.ToDouble(txtProductDiscRate.Text).ToString();
dtCurrentTable.Tables[0].Rows[GrdDetails.SelectedIndex]["DiscAmt"] = Convert.ToDouble(txtProductDiscAmt.Text).ToString();
dtCurrentTable.Tables[0].Rows[GrdDetails.SelectedIndex]["ProductNetAmt"] = Convert.ToDouble(txtProductNetAmt.Text).ToString();
dtCurrentTable.Tables[0].Rows.Add(drCurrentRow);
}
ViewState["SalesDetail"] = dtCurrentTable;
for (int i = 0; i <= dtCurrentTable.Tables[0].Rows.Count - 1; i++)
{
if (Convert.ToString(dtCurrentTable.Tables[0].Rows[i]["ProductID"]).Equals(""))
{
dtCurrentTable.Tables[0].Rows[i].Delete();
dtCurrentTable.Tables[0].AcceptChanges();
}
}
GrdDetails.DataSource = dtCurrentTable;
GrdDetails.DataBind();
CalculateTotal();
}
Clear();
btnInsert.Text = "Insert";
hfProductId.Value = "";
}
}
catch (Exception ex)
{
string error1 = ex.Message.Replace(((char)34).ToString(), "");
error1 = error1.Replace(((char)39).ToString(), "");
ScriptManager.RegisterStartupScript(Page, this.GetType(), "Call", "alert('" + (error1.ToString()) + "')", true);
}
}
Screenshot
