判斷資料是否重複輸入

小裕
想請教一下
如下的判斷,
我是想做如輸入相同值就跳重複值訊息,
有讀到資料就帶資料進來,如果沒有符合就跳找不到品號,

現在這樣是找到資料還是會跳重複值的訊息



   protected void t_TextChanged(object sender, EventArgs e)
        {
            string ConnectionString=System.Web.Configuration.WebConfigurationManager.ConnectionStrings["readerConnectionString"].ConnectionString;
            SqlConnection conn = new SqlConnection(ConnectionString);
            conn.Open();

            DataTable dt = (DataTable)ViewState["Curtbl"];
   
            foreach (GridViewRow rw in this.gv.Rows)
            {
                TextBox tTextBox1 = (TextBox)rw.FindControl("TextBox1");
                TextBox tTextBox2 = (TextBox)rw.FindControl("TextBox2");
                TextBox tTextBox3 = (TextBox)rw.FindControl("TextBox3");
                TextBox tTextBox4 = (TextBox)rw.FindControl("TextBox4");

                string m_Text = tTextBox1.Text.Trim();
                bool m_IsExist = false;
                foreach (DataRow dr in dt.Rows)
                {
                    if (m_Text == dr[1].ToString().Trim())
                    {
                        m_IsExist = true;
                        break;
                    }
                }

                if (!m_IsExist)
                {
                try
                {
                        SqlCommand command = new SqlCommand("select MB001,MB002,MB003,MB064 from INVMB where MB001='" + tTextBox1.Text + "'", conn);
                        //conn.Open();
                        SqlDataReader reader1;
                        reader1 = command.ExecuteReader();

                        if (reader1.Read() && tTextBox1.Text != "")
                        {
                            tTextBox2.Text = reader1["MB002"].ToString();
                            tTextBox3.Text = reader1["MB003"].ToString();
                            string r_qty = reader1["MB064"].ToString();
                            double a = Convert.ToDouble(r_qty.ToString());
                            tTextBox4.Text = a.ToString();
                         

                        }
                        else 
                        {
                            String TransferPage;
                            TransferPage = "<script>alert('找不到該品號!')</script>";
                            ScriptManager.RegisterStartupScript(Page, Page.GetType(), "temp", TransferPage, false);
                            tTextBox1.Text="";

                        }
           reader1.Close();

                }
                catch
                {


                }

                }
                else
                {
                    //tTextBox1.Text = "";
                    String TransferPage1;
                    TransferPage1 = "<script>alert('重複值!')</script>";
                    ScriptManager.RegisterStartupScript(Page, Page.GetType(), "temp", TransferPage1, false);
                    //this.lblErrorMessage.Visible = true;
                }
            }
        }

阿恢
如果我沒理解錯的話,你想做的是,把TextBox1的值,透過select MB001,MB002,MB003,MB064 from INVMB where MB001= 這一段SQL,去撈出符合的品號,然後再把MB002、MB003、MB064分別塞到TextBox2、TextBox3、TextBox4吧?

MB001是品號,基本上不會重複,所以你要做的只是比對到相同品號,然後塞值...

protected void t_TextChanged(object sender, EventArgs e) 
{ 
  string ConnectionString=System.Web.Configuration.WebConfigurationManager.ConnectionStrings["readerConnectionString"].ConnectionString; 
  SqlConnection conn = new SqlConnection(ConnectionString); 
  SqlCommand command;
  SqlDataReader reader1;
  conn.Open();

  DataTable dt = (DataTable)ViewState["Curtbl"];

  TextBox tTextBox1 = (TextBox)rw.FindControl("TextBox1"); 
  TextBox tTextBox2 = (TextBox)rw.FindControl("TextBox2"); 
  TextBox tTextBox3 = (TextBox)rw.FindControl("TextBox3"); 
  TextBox tTextBox4 = (TextBox)rw.FindControl("TextBox4"); 

  string m_Text = tTextBox1.Text.Trim(); 
  bool m_IsExist = false;
  DataRow[] foundRows;
  string expression;
  expression = "MB001 = '" + m_Text + "'";

  //不太清楚你原本第一個foreach要幹嘛

  //第二個foreach看起來是要把TextBox1.Text跟dt[1]做逐比比較,不過dt[1]應該有名稱,在此假設是dt["MB001"]好了,直接select就好了。
  foundRows = dt.Select(expression);
  //大於零就表示有找到資料
  if (foundRows.Length > 0)
  {
    m_IsExist = true;
  }
  
  if (!m_IsExist) 
  { 
    command = new SqlCommand("select MB001,MB002,MB003,MB064 from INVMB where MB001='" + tTextBox1.Text + "'", conn); 
    //conn.Open();  
    reader1 = command.ExecuteReader(); 
	 
    if (reader1.Read() && tTextBox1.Text != "") 
    { 
       tTextBox2.Text = reader1["MB002"].ToString(); 
       tTextBox3.Text = reader1["MB003"].ToString(); 
       string r_qty = reader1["MB064"].ToString(); 
       double a = Convert.ToDouble(r_qty.ToString()); 
       tTextBox4.Text = a.ToString(); 
    } 
    else  
    { 
       String TransferPage; 
       TransferPage = "<script>alert('找不到該品號!')</script>"; 
       ScriptManager.RegisterStartupScript(Page, Page.GetType(), "temp", TransferPage, false); 
       tTextBox1.Text=""; 
    } 
    reader1.Close(); 
  }
  else 
  { 
    //tTextBox1.Text = ""; 
    String TransferPage1; 
    TransferPage1 = "<script>alert('重複值!')</script>"; 
    ScriptManager.RegisterStartupScript(Page, Page.GetType(), "temp", TransferPage1, false); 
    //this.lblErrorMessage.Visible = true; 
  } 
}

topcat
您好

有點不太懂您需求的邏輯
您寫在TextChange事件
是什麼樣的TextChange? GridView中的,還是外面的?

您從GridView裡面的GridViewRow逐筆取出資料
但是比對的卻是放在ViewState的DataTable??

到底是要比對GridView的資料?還是要比對資料庫的資料?

假設ViewState中的DataTable是曾經從資料庫中的資料
那麼為何不直接讀資料庫,判斷是否已經存在資料庫中
要從ViewState去取得呢?


是否可以更具體的描述,或者用個圖形描述一下您想做什麼
這樣比較能夠給您合適的回答

^.^a

小裕
應該是兩個需求

第一個是去資料庫比對資料
有找到資料就顯示在gridview中

但假設我已經打了一筆0001
下一筆要再打0001的時候,要跳出重複值的訊息

小裕
TO 1:

第一個foreach我是要找第一個TEXTBOX的ID
跟DATAREADER那個值相符,就將資料寫到
gridview
小裕
一樓的方向理解是對的
我修正如下:
現在的問題還是找到資料後,塞到gridview的textbox
一樣會跳出重複值這個訊息,正常應該就帶值出來而已,不會跳窗
如果reader不到資料應該跳找不到品號,現在都跳重複值


現在看來是相同值會跳出視窗提醒相同值.
但上述兩個地方還是有些問題
是迴圈的關係嗎?

       string ConnectionString = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["TAROKOConnectionString"].ConnectionString;
            SqlConnection conn = new SqlConnection(ConnectionString);
            conn.Open();

            DataTable dt = (DataTable)ViewState["Curtbl"];
   
            foreach (GridViewRow rw in this.gv.Rows)
            {
                TextBox tTextBox1 = (TextBox)rw.FindControl("TextBox1");
                TextBox tTextBox2 = (TextBox)rw.FindControl("TextBox2");
                TextBox tTextBox3 = (TextBox)rw.FindControl("TextBox3");
                TextBox tTextBox4 = (TextBox)rw.FindControl("TextBox4");

                string m_Text = tTextBox1.Text.Trim();
                bool m_IsExist = false;

                DataRow[] foundRows;
                string expression;
                expression = "TextBox1 = '" + m_Text + "'";

                foundRows = dt.Select(expression);
                if (foundRows.Length > 0)
                {
                    m_IsExist = true;
                }

                if (!m_IsExist)
                {
                
                        SqlCommand command = new SqlCommand("select MB001,MB002,MB003,MB064 from INVMB where MB001='" + tTextBox1.Text + "'", conn);
                        //conn.Open();
                        SqlDataReader reader1;
                        reader1 = command.ExecuteReader();

                        if (reader1.Read())
                        {
                            tTextBox2.Text = reader1["MB002"].ToString();
                            tTextBox3.Text = reader1["MB003"].ToString();
                            string r_qty = reader1["MB064"].ToString();
                            double a = Convert.ToDouble(r_qty.ToString());
                            tTextBox4.Text = a.ToString();

                        }
                        else 
                        {
                        String TransferPage;
                        TransferPage = "<script>alert('找不到該品號!')</script>";
                        ScriptManager.RegisterStartupScript(Page, Page.GetType(), "temp", TransferPage, false);
                        tTextBox1.Text = "";

                        }
                        reader1.Close();
                }
                else 
               {
                    //tTextBox1.Text = "";
                    String TransferPage1;
                    TransferPage1 = "<script>alert('重複值!')</script>";
                    ScriptManager.RegisterStartupScript(Page, Page.GetType(), "temp", TransferPage1, false);
                    //this.lblErrorMessage.Visible = true;
                }

          
            }
        }

小裕
補充前端資料
這是動態產的gridview

  <asp:UpdatePanel ID="UpdatePanel" runat="server" UpdateMode="Conditional">
    <ContentTemplate>                    
                 
        <asp:GridView ID="gv" runat="server" ShowFooter="true"  HeaderStyle-HorizontalAlign="Center" RowStyle-HorizontalAlign="Center" AutoGenerateColumns="false" Width="100%" OnRowDeleting="gv_RowDeleting" CellPadding="3" GridLines="None" BorderStyle="Solid" BorderWidth="1px">
          
           <Columns>
               
        <asp:BoundField DataField="rowid" HeaderText="項次" />
        <asp:TemplateField HeaderText="品號">
            <ItemTemplate>
                <asp:TextBox ID="TextBox1"  CssClass="GridTextBox" onblur="Change(this, event)" onfocus="Change(this, event)" Width="80" MaxLength="10" runat="server" EnableViewState="true"  AutoPostBack="true"  OnTextChanged="t_TextChanged"></asp:TextBox>
            </ItemTemplate>

        </asp:TemplateField>

        <asp:TemplateField HeaderText="品名">
            <ItemTemplate>
                <asp:TextBox ID="TextBox2" Width="150" runat="server"></asp:TextBox>
            </ItemTemplate>
        </asp:TemplateField>

        <asp:TemplateField HeaderText="規格">
            <ItemTemplate>
                 <asp:TextBox ID="TextBox3"  Width="150" runat="server"></asp:TextBox>
            </ItemTemplate>
                  </asp:TemplateField>
       
    <asp:TemplateField HeaderText="庫存量">
            <ItemTemplate>
                 <asp:TextBox ID="TextBox4" Width="80" runat="server"></asp:TextBox>
            </ItemTemplate>
<ItemStyle HorizontalAlign="Center"></ItemStyle>
                    <%-- </asp:TemplateField>--%>
             <%--    <asp:TemplateField ItemStyle-HorizontalAlign="Center"> --%> 
         <%--   <ItemTemplate>  
                <asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="false" 
                                        onclick="LinkButton1_Click">Remove</asp:LinkButton>  
            </ItemTemplate>   --%> 
                       <FooterStyle HorizontalAlign="Center"/>  
                      <FooterTemplate>
   <asp:Button ID="ButtonAdd" runat="server" CausesValidation="false" onclick="ButtonAdd_Click" Text="新增料件"  Font-Names="新細明體" />
            </FooterTemplate>     
                    </asp:TemplateField> 

                   <asp:CommandField ButtonType="Image" ItemStyle-Width="50"  DeleteImageUrl="~/Data/icon_clear.gif" ShowDeleteButton="true" />   

        </Columns>
     <HeaderStyle CssClass="GridviewScrollHeader" ForeColor="Black" /> 
    <RowStyle CssClass="GridviewScrollItem" ForeColor="Black" /> 
    <PagerStyle CssClass="GridviewScrollPager" />
        </asp:GridView>
        </ContentTemplate>
        </asp:UpdatePanel>




   protected void BindGridview()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("rowid", typeof(int));
            dt.Columns.Add("TextBox1", typeof(string));
            dt.Columns.Add("TextBox2", typeof(string));
            dt.Columns.Add("TextBox3", typeof(string));
            dt.Columns.Add("TextBox4", typeof(string));
            DataRow dr = dt.NewRow();
            dr["rowid"] = 1;
            dr["TextBox1"] = string.Empty;
            dr["TextBox2"] = string.Empty;
            dr["TextBox3"] = string.Empty;
            dr["TextBox4"] = string.Empty;
            dt.Rows.Add(dr);
            ViewState["Curtbl"] = dt;
            gv.DataSource = dt;
            gv.DataBind();
          
        }

真的有點難
在資料庫裏面把品號設定為primary key
把insert sql
try catch
比較簡單吧!?
阿恢
看起來你是要把GridView裡的品號當成查詢欄位,只要在INVMB裡找到該筆產品資料,就帶入品號後面的品名、規格與庫存量這亖個TextBox。

如果使用者再打同樣的品號,就會顯示已經重複了,以確保GridView不會出現兩筆一模一樣的資料。
小裕
需求是這樣沒錯,所以選擇在前端就先判斷,沒有做在新增資料時才去判斷有無重複值!(如7樓的建議)
回到頂部