webForumDet fria alternativet

Anropa Stored Procedure med C#

.NETur .NET

22 svar · 1 450 visningar · startad av Sanji

Medlem sedan juli 2009355 inlägg
Frågan#1

okej, nu har jag gjort om min SP som du skrivit... Nu känns det faktiskt som att det börjar likna något :) BTW, är det någon som har sagt till dig att du förklarar väldigt bra/lätt förståeligt? ^^

nu har jag en till fråga, hur hittar jag denna SP?

förut när jag frågade hur jag kör en Stored Procedure så svarade @nders:

EXEC din_procedur värde1, värde2, värde3

hur fungerar detta? måste jag inkludera något först?

inkluderade sqlclient, har sedan gjort så här:

SqlCommand cmd = new SqlCommand("AddArticles_InqArticles");
                cmd.CommandType = CommandType.StoredProcedure;// ej säker på hur det ska vara här
                cmd.Parameters.Add(new SqlParameter(""));//värden som ska sparas

har dock ingen aning om exakt hur det ska se ut, se kommentaren.

Medlem sedan jan. 20023 327 inlägg
#2

Sanji skrev:

okej, nu har jag gjort om min SP som du skrivit... Nu känns det faktiskt som att det börjar likna något :)

(y)

Sanji skrev:

BTW, är det någon som har sagt till dig att du förklarar väldigt bra/lätt förståeligt?

Tack :)

Sanji skrev:

nu har jag en till fråga, hur hittar jag denna SP?

förut när jag frågade hur jag kör en Stored Procedure så svarade @nders:

hur fungerar detta? måste jag inkludera något först?

Om du ska anropa en SP via t-sql så gör du precis som @nders skrev, men är det inte så att du vill anropa din SP från C#? I så fall kan du hitta information om det här: http://www.java2s.com/Tutorial/CSharp/0560__ADO.Net/0260__SqlConnection-Stored-Procedure.htm

Medlem sedan juli 2009355 inlägg
#3

Mycket riktigt så vill jag anropa den från C# :)

@nders skrev:

EXEC din_procedur värde1, värde2, värde3

Sanji skrev:

okej, nu har jag gjort om min SP som du skrivit... Nu känns det faktiskt som att det börjar likna något :) BTW, är det någon som har sagt till dig att du förklarar väldigt bra/lätt förståeligt? ^^

nu har jag en till fråga, hur hittar jag denna SP?

förut när jag frågade hur jag kör en Stored Procedure så svarade @nders:

hur fungerar detta? måste jag inkludera något först?

inkluderade sqlclient, har sedan gjort så här:

SqlCommand cmd = new SqlCommand("AddArticles_InqArticles");
                cmd.CommandType = CommandType.StoredProcedure;// ej säker på hur det ska vara här
                cmd.Parameters.Add(new SqlParameter(""));//värden som ska sparas

har dock ingen aning om exakt hur det ska se ut, se kommentaren.

Nu ska vi se här, jag får felmeddelande "the name CommandType doesn't exist in the current context", det är denna rad som krånglar:
cmd.CommandType = CommandType.StoredProcedure;

jag plågar google en stund och ser om jag hittar något av nytta!

det löste sig när jag lade till:

using System.Data;
^^

Medlem sedan jan. 20023 327 inlägg
#4

Du behöver lägga till rätt namespace. Ställ markören på SqlCommand och tryck "Ctrl + ." (håll inne Ctrl och tryck på punkt m.a.o.). Tryck därefter på enter för importera namespacet. Eller så lägger du till namespacet manuelt genom att skriva "using System.Data.SqlClient;" högst upp i filen tillsammans med de andra using-direktiven. Det är möjligt att du kan behöva gör det här för fler datatyper, gör då samma sak för dessa. "Ctrl + ." är ett väldigt smidigt kommando för att importera namespace med automatik.

Medlem sedan juli 2009355 inlägg
#5

vad skönt att kunna göra så :)

Nu ska jag köra denna, men endast ifall första alternativet i en dropdownlista är vald. Jag har gjort så här, men det fungerar inte.

if (((DropDownList)InquiryTableArticles.FindControl("ddlArticleList")).SelectedItem.Value == "Ny_Artikel")

Vilket annat sätt kan man använda sig av för att kolla om det är första raden som är markerad, istället för att kolla vad värdet på den markerade raden är?

anledningen till att jag inte vill kolla värdet är för att dropdownlistans första alternativ går att ändra på. därför är det bättre att kolla om första alternativet är valt.

felet jag fick när jag gjorde som ovan var:

Objektreferensen har inte angetts till en instans av ett objekt.

är det this jag måste använda, och i så fall vart?

ändrade den till:

if (((DropDownList)InquiryTableArticles.FindControl("ddlArticleList")).SelectedIndex < 1)

Mvh. Sanji

Medlem sedan jan. 20023 327 inlägg
#6

Så här borde du kunna göra:

if (this.ddlArticleList.SelectedIndex == 0)
{
// do stuff
}
Medlem sedan juli 2009355 inlägg
#7

Nu har jag problem med någon validering? ingen aning om hur man löser detta, jag har testat att sätta CausesValidation på dropdownlistan till false, men utan framgång.

Meddelandet som visas:

Ogiltigt återanslag- eller återanropselement. Händelseverifiering aktiveras med <pages enableEventValidation="true"/> i konfigurationen eller <%@ Page EnableEventValidation="true" %> på sidan. Av säkerhetsskäl verifierar denna funktion att argumenten till återanslående- eller återanropshändelser kommer från den serverkontroll som ursprunligen renderade dem. Om data är giltiga och förväntade, bör du använda metoden ClientScriptManager.RegisterForEventValidation för att registrera verifieringsdata.
Beskrivning: Ett undantag som inte kunde hanteras uppstod när den aktuella webbegäran kördes. Mer information om felet och var i koden det uppstod finns i stackspårningen.

Undantagsinformation: System.ArgumentException: Ogiltigt återanslag- eller återanropselement. Händelseverifiering aktiveras med <pages enableEventValidation="true"/> i konfigurationen eller <%@ Page EnableEventValidation="true" %> på sidan. Av säkerhetsskäl verifierar denna funktion att argumenten till återanslående- eller återanropshändelser kommer från den serverkontroll som ursprunligen renderade dem. Om data är giltiga och förväntade, bör du använda metoden ClientScriptManager.RegisterForEventValidation för att registrera verifieringsdata.

ska jag använda ClientScriptManager.RegisterForEventValidation ?

hur gör man detta?

EDIT*

nu har jag stängt av page validation så länge, så jag kan koncentrera mig på det andra problemet:

"Objektreferensen har inte angetts till en instans av ett objekt." if-satsen finns inne i ett event då man trycker på en knapp, hur kan jag komma åt dropdownlistan därifrån? Dropdownlistan ligger i en metod som heter "refreshtable".

Mvh. Sanji

Medlem sedan juli 2009355 inlägg
#8

om jag gör: this.FindControl("MyControl") så kan jag inte använda SelectedIndex... hur ska jag göra det? om jag har fattat rätt så måste applikationen veta att det är en dropdownlist för att kunna använda SelectedIndex...

Kan man använda this på en sådan här på något sätt?

if (((DropDownList)InquiryTableArticles.FindControl("ddlArticleList")).SelectedIndex == 0)

jag hittade hur man kunde göra, men det hjälpte inte... jag får fortfarande felmeddelandet:
"Objektreferensen har inte angetts till en instans av ett objekt."

jag gjorde så här:

(this.FindControl("ddlArticleList") as DropDownList).SelectedIndex == 0
Medlem sedan jan. 20023 327 inlägg
#9

Hmm... Heter kontrollen ddlArticleList och är det en DropDownList? Känns som något av detta inte stämmer eftersom du får null vid typomvandlingen. Du får nog visa lite mer kod helt enkelt, om vi ska kunna hjälpa dig.

Medlem sedan juli 2009355 inlägg
#10

jag tror att jag har lyckats få det att funka hyfsat!

anledningen till att det inte fungerade först var för att jag hade skrivit fel namn på dropdownlistan -.-

här har jag koden som jag skrivit hittills:

if (((DropDownList)InquiryTableArticles.FindControl("ddlAddInquiryArticleArticle")).SelectedIndex == 0)
            {

                Article tempart = new Article();
                tempart.ArticleNumber = ((DropDownList)InquiryTableArticles.FindControl("ddlAddInquiryArticleArticle")).Text;
                tempart.Term = ((TextBox)InquiryTableArticles.FindControl("txtAddInquiryArticleTerm")).Text;
                SqlConnection conn = new SqlConnection("Data Source=.\\SQLExpress;Integrated Security=true; AttachDbFilename=|DataDirectory|\\databas.mdf;User Instance=true;");
                SqlCommand cmd = new SqlCommand("AddArticles_InqArticles", conn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add(new SqlParameter("@companyID", currentUser.CompanyID));
                cmd.Parameters.Add(new SqlParameter("@articlenr", tempart.ArticleNumber));
                cmd.Parameters.Add(new SqlParameter("@term", tempart.Term));
                cmd.Parameters.Add(new SqlParameter("@description", ""));
                
                cmd.Parameters.Add(new SqlParameter("@inquiryID", Dropdownlistinquiries.SelectedValue));
                cmd.Parameters.Add(new SqlParameter("@notice", 1));
                cmd.Parameters.Add(new SqlParameter("@revnr",  ((TextBox)InquiryTableArticles.FindControl("txtAddInquiryArticleRevnumber")).Text ));
                cmd.Parameters.Add(new SqlParameter("@pieces", ((TextBox)InquiryTableArticles.FindControl("txtAddInquiryArticlePcs")).Text));
                cmd.Parameters.Add(new SqlParameter("@suborder", ((TextBox)InquiryTableArticles.FindControl("txtAddInquiryArticleSuborder")).Text));
                cmd.Parameters.Add(new SqlParameter("@articletext", ""));
                
                conn.Open();
                cmd.ExecuteNonQuery();
                conn.Close();
            }

Nu läggs artikeln till i både artikelregistret och tabellen för förfråganartiklarna :)

det finns dock ett problem, och det är att artikelnumret man skriver in i den ändringsbara dropdownlistan sparas inte när man lägger till artikeln, utan default-värdet Ny_Artikel sparas istället. Betyder det att default-värdet ligger sparat som Value även efter att man skrivit in något annat, och att man på något sätt måste uppdatera det värdet innan man sparar? Iofs, jag kan väl använda .text istället för .value? då borde det lösa sig!

Medlem sedan juli 2009355 inlägg
#11

inser nu att jag redan använder mig av .text... det står ju till och med i koden jag har skickat med! vad dum jag känner mig ibland ^^

Medlem sedan juli 2009355 inlägg
#12

Detta är javascript-koden för att göra dropdownlistan ändringsbar:

<script language="JavaScript">    //Common functions for all dropdowns

    /*----------------------------------------------
    The Common functions used for all dropdowns are:
    -----------------------------------------------

    -- function FindKeyCode(e)
    -- function FindKeyChar(e)
    -- function fnLeftToRight(getdropdown)
    -- function fnRightToLeft(getdropdown) */

    function fnLeftToRight(getdropdown) {
        getdropdown.style.direction = "ltr";
    }

    function fnRightToLeft(getdropdown) {
        getdropdown.style.direction = "rtl";
    }

    /*
    Since Internet Explorer and NetscapeFirefoxChrome have different
    ways of returning the key code, displaying keys
    browser-independently is a bit harder.
    However, you can create a script that displays keys
    for either browser.
    The following function will display each key
    in the status line:

    The "FindKey.." function receives the "event" object
    from the event handler and stores it in the variable "e".
    It checks whether the "e.which" property exists (for NetscapeFirefoxChrome),
    and stores it in the "keycode" variable if present.
    Otherwise, it assumes the browser is Internet Explorer
    and assigns to keycode the "e.keyCode" property.
    */

    function FindKeyCode(e) {
        if (e.which) {
            keycode = e.which;  //NetscapeFirefoxChrome
        }
        else {
            keycode = e.keyCode; //Internet Explorer
        }

        //alert("FindKeyCode"+ keycode);
        return keycode;
    }

    function FindKeyChar(e) {
        keycode = FindKeyCode(e);
        if ((keycode == 8) || (keycode == 127)) {
            character = "backspace"
        }
        else if ((keycode == 46)) {
            character = "delete"
        }
        else {
            character = String.fromCharCode(keycode);
        }
        //alert("FindKey"+ character);
        return character;
    }

</script>

<script language="JavaScript">    //Dropdown specific functions, which manipulate dropdown specific global variables

    /*----------------------------------------------
    Dropdown specific global variables are:
    -----------------------------------------------
    1) vEditableOptionIndex_A   --> this needs to be set by Programmer!! See explanation.
    2) vEditableOptionText_A    --> this needs to be set by Programmer!! See explanation.
    3) vPreviousSelectIndex_A
    4) vSelectIndex_A
    5) vSelectChange_A

    ---------------------------  */

    /*----------------------------------------------
    Dropdown specific functions
    (which manipulate dropdown specific global variables)
    -----------------------------------------------
    1) function fnChangeHandler_A(getdropdown)
    2) function fnKeyPressHandler_A(getdropdown, e)
    3) function fnKeyUpHandler_A(getdropdown, e)
    4) function fnKeyDownHandler_A(getdropdown, e)

    ---------------------------  */

    /*------------------------------------------------
    IMPORTANT: Global Variable required to be SET by programmer
    --------------------------   */

    var vEditableOptionIndex_A = 0;

    // Give Index of Editable option in the dropdown.
    // For eg.
    // if first option is editable then vEditableOptionIndex_A = 0;
    // if second option is editable then vEditableOptionIndex_A = 1;
    // if third option is editable then vEditableOptionIndex_A = 2;
    // if last option is editable then vEditableOptionIndex_A = (length of dropdown - 1).
    // Note: the value of vEditableOptionIndex_A cannot be greater than (length of dropdown - 1)

    var vEditableOptionText_A = "Ny_Artikel";

    // Give the default text of the Editable option in the dropdown.
    // For eg.
    // if the editable option is <option ...>--?--</option>,
    // then set vEditableOptionText_A = "--?--";

    /*------------------------------------------------
    Global Variables required for
    fnChangeHandler_A(), fnKeyPressHandler_A() and fnKeyUpHandler_A()
    for Editable Dropdowns
    --------------------------   */

    var vPreviousSelectIndex_A = 0;
    // Contains the Previously Selected Index, set to 0 by default

    var vSelectIndex_A = 0;
    // Contains the Currently Selected Index, set to 0 by default

    var vSelectChange_A = 'MANUAL_CLICK';
    // Indicates whether Change in dropdown selected option
    // was due to a Manual Click
    // or due to System properties of dropdown.

    // vSelectChange_A = 'MANUAL_CLICK' indicates that
    // the jump to a non-editable option in the dropdown was due
    // to a Manual click (i.e.,changed on purpose by user).

    // vSelectChange_A = 'AUTO_SYSTEM' indicates that
    // the jump to a non-editable option was due to System properties of dropdown
    // (i.e.,user did not change the option in the dropdown;
    // instead an automatic jump happened due to inbuilt
    // dropdown properties of browser on typing of a character )

    /*------------------------------------------------
    Functions required for  Editable Dropdowns
    --------------------------   */

    function fnSanityCheck_A(getdropdown) {
        if (vEditableOptionIndex_A > (getdropdown.options.length - 1)) {
            alert("PROGRAMMING ERROR: The value of variable vEditableOptionIndex_... cannot be greater than (length of dropdown - 1)");
            return false;
        }
    }

    function fnKeyDownHandler_A(getdropdown, e) {
        fnSanityCheck_A(getdropdown);

        // Press [ <- ] and [ -> ] arrow keys on the keyboard to change alignment/flow.
        // ...go to Start : Press  [ <- ] Arrow Key
        // ...go to End : Press [ -> ] Arrow Key
        // (this is useful when the edited-text content exceeds the ListBox-fixed-width)
        // This works best on Internet Explorer, and not on NetscapeFirefoxChrome

        var vEventKeyCode = FindKeyCode(e);

        // Press left/right arrow keys
        if (vEventKeyCode == 37) {
            fnLeftToRight(getdropdown);
        }
        if (vEventKeyCode == 39) {
            fnRightToLeft(getdropdown);
        }

        // Delete key pressed
        if (vEventKeyCode == 46) {
            if (getdropdown.options.length != 0)
            // if dropdown is not empty
            {
                if (getdropdown.options.selectedIndex == vEditableOptionIndex_A)
                // if option is the Editable field
                {
                    getdropdown.options[getdropdown.options.selectedIndex].text = '';
                    getdropdown.options[getdropdown.options.selectedIndex].value = '';
                }
            }
        }

        // backspace key pressed
        if (vEventKeyCode == 8 || vEventKeyCode == 127) {
            if (getdropdown.options.length != 0)
            // if dropdown is not empty
            {
                if (getdropdown.options.selectedIndex == vEditableOptionIndex_A)
                // if option is the Editable field
                {
                    // make Editable option Null if it is being edited for the first time
                    if ((getdropdown[vEditableOptionIndex_A].text == vEditableOptionText_A) || (getdropdown[vEditableOptionIndex_A].value == vEditableOptionText_A)) {
                        getdropdown.options[getdropdown.options.selectedIndex].text = '';
                        getdropdown.options[getdropdown.options.selectedIndex].value = '';
                    }
                    else {
                        getdropdown.options[getdropdown.options.selectedIndex].text = getdropdown.options[getdropdown.options.selectedIndex].text.slice(0, -1);
                        getdropdown.options[getdropdown.options.selectedIndex].value = getdropdown.options[getdropdown.options.selectedIndex].value.slice(0, -1);
                    }
                }
            }
            if (e.which) //NetscapeFirefoxChrome
            {
                e.which = '';
            }
            else //Internet Explorer
            {
                e.keyCode = '';
            }
            if (e.cancelBubble)	  //Internet Explorer
            {
                e.cancelBubble = true;
                e.returnValue = false;
            }
            if (e.stopPropagation)	 //NetscapeFirefoxChrome
            {
                e.stopPropagation();
            }
            if (e.preventDefault)	 //NetscapeFirefoxChrome
            {
                e.preventDefault();
            }
        }
    }

    function fnChangeHandler_A(getdropdown) {
        fnSanityCheck_A(getdropdown);

        vPreviousSelectIndex_A = vSelectIndex_A;
        // Contains the Previously Selected Index

        vSelectIndex_A = getdropdown.options.selectedIndex;
        // Contains the Currently Selected Index

        if ((vPreviousSelectIndex_A == (vEditableOptionIndex_A)) && (vSelectIndex_A != (vEditableOptionIndex_A)) && (vSelectChange_A != 'MANUAL_CLICK'))
        // To Set value of Index variables 
        {
            getdropdown[(vEditableOptionIndex_A)].selected = true;
            vPreviousSelectIndex_A = vSelectIndex_A;
            vSelectIndex_A = getdropdown.options.selectedIndex;
            vSelectChange_A = 'MANUAL_CLICK';
            // Indicates that the Change in dropdown selected
            // option was due to a Manual Click
        }
    }

    function fnKeyPressHandler_A(getdropdown, e) {
        fnSanityCheck_A(getdropdown);

        keycode = FindKeyCode(e);
        keychar = FindKeyChar(e);

        // Check for allowable Characters
        // The various characters allowable for entry into Editable option..
        // may be customized by minor modifications in the code (if condition below)
        // (you need to know the keycode/ASCII value of the  character to be allowed/disallowed.
        

        if ((keycode > 47 && keycode < 59) || (keycode > 62 && keycode < 127) || (keycode == 32)) {
            var vAllowableCharacter = "yes";
        }
        else {
            var vAllowableCharacter = "no";
        }

        //alert(window); alert(window.event);

        if (getdropdown.options.length != 0)
        // if dropdown is not empty
            if (getdropdown.options.selectedIndex == (vEditableOptionIndex_A))
            // if selected option the Editable option of the dropdown
            {

                // Empty space (ascii 32)  is not captured by NetscapeFirefoxChrome when .text is used
                // NetscapeFirefoxChrome removes extra spaces at end of string when .text is used
                // NetscapeFirefoxChrome allows one empty space at end of string when .value is used
                // Hence, use .value insead of .text
                var vEditString = getdropdown[vEditableOptionIndex_A].value;

                // make Editable option Null if it is being edited for the first time
                if (vAllowableCharacter == "yes") {
                    if ((getdropdown[vEditableOptionIndex_A].text == vEditableOptionText_A) || (getdropdown[vEditableOptionIndex_A].value == vEditableOptionText_A))
                        vEditString = "";
                }

                if (vAllowableCharacter == "yes")
                // To handle addition of a character
                {
                    vEditString += String.fromCharCode(keycode);
                    // Concatenate Enter character to Editable string

                    // The following portion handles the "automatic Jump" bug
                    // The "automatic Jump" bug (Description):
                    //   If a alphabet is entered (while editing)
                    //   ...which is contained as a first character in one of the read-only options
                    //   ..the focus automatically "jumps" to the read-only option
                    //   (-- this is a common property of normal dropdowns
                    //    ..but..is undesirable while editing).

                    var i = 0;
                    var vEnteredChar = String.fromCharCode(keycode);
                    var vUpperCaseEnteredChar = vEnteredChar;
                    var vLowerCaseEnteredChar = vEnteredChar;

                    if (((keycode) >= 97) && ((keycode) <= 122))
                    // if vEnteredChar lowercase
                        vUpperCaseEnteredChar = String.fromCharCode(keycode - 32);
                    // This is UpperCase

                    if (((keycode) >= 65) && ((keycode) <= 90))
                    // if vEnteredChar is UpperCase
                        vLowerCaseEnteredChar = String.fromCharCode(keycode + 32);
                    // This is lowercase

                    if (e.which) //For NetscapeFirefoxChrome
                    {
                        // Compare the typed character (into the editable option)
                        // with the first character of all the other
                        // options (non-editable).

                        // To note if the jump to the non-editable option was due
                        // to a Manual click (i.e.,changed on purpose by user)
                        // or due to System properties of dropdown
                        // (i.e.,user did not change the option in the dropdown;
                        // instead an automatic jump happened due to inbuilt
                        // dropdown properties of browser on typing of a character )

                        for (i = 0; i <= (getdropdown.options.length - 1); i++) {
                            if (i != vEditableOptionIndex_A) {
                                var vReadOnlyString = getdropdown[i].value;
                                var vFirstChar = vReadOnlyString.substring(0, 1);
                                if ((vFirstChar == vUpperCaseEnteredChar) || (vFirstChar == vLowerCaseEnteredChar)) {
                                    vSelectChange_A = 'AUTO_SYSTEM';
                                    // Indicates that the Change in dropdown selected
                                    // option was due to System properties of dropdown
                                    break;
                                }
                                else {
                                    vSelectChange_A = 'MANUAL_CLICK';
                                    // Indicates that the Change in dropdown selected
                                    // option was due to a Manual Click
                                }
                            }
                        }
                    }
                }

                // Set the new edited string into the Editable option
                getdropdown.options[vEditableOptionIndex_A].text = vEditString;
                getdropdown.options[vEditableOptionIndex_A].value = vEditString;

                return false;
            }
        return true;
    }

    function fnKeyUpHandler_A(getdropdown, e) {
        fnSanityCheck_A(getdropdown);

        if (e.which) // NetscapeFirefoxChrome
        {
            if (vSelectChange_A == 'AUTO_SYSTEM') {
                // if editable dropdown option jumped while editing
                // (due to typing of a character which is the first character of some other option)
                // then go back to the editable option.
                getdropdown[(vEditableOptionIndex_A)].selected = true;
            }

            var vEventKeyCode = FindKeyCode(e);
            // if [ <- ] or [ -> ] arrow keys are pressed, select the editable option
            if ((vEventKeyCode == 37) || (vEventKeyCode == 39)) {
                getdropdown[vEditableOptionIndex_A].selected = true;
            }
        }
    }

    /*-------------------------------------------------------------------------------------------- Subrata Chakrabarty */

</script>  <!--end of script for dropdown lstDropDown_A -->

jag gissar på att problemet jag har ligger i scriptet...

När jag har skrivit in en text i första alternativet av dropdownlistan, och sedan använder t.ex. .selectedvalue så är det default-värdet som alltid används. Någon som ser det jag inte ser?

Mvh. Sanji

Medlem sedan juni 200032 967 inlägg
#13

Det är inte så att du fyller upp din dropdownlista även vid postback?

Medlem sedan juli 2009355 inlägg
#14

det kan nog stämma, det borde ligga i pageload i så fall?

Medlem sedan juni 200032 967 inlägg
#15

Jepp.

Om det ligger där, prova att lägga en if-sats runt, typ:

if (!Page.IsPostBack) {
    // fyll dropdown här 
}
Medlem sedan juli 2009355 inlägg
#16

RefreshTable() ligger där, men när jag sätter denna i:

if(!isPostBack)
{
RefreshTable()
}

så klagar applikationen på att den inte kan hitta ett id för en textbox som måste valideras så att användaren inte skriver in bokstäver... då måste jag alltså lägga if-satsen inuti RefreshTable(), runt bara dropdownlistan när den fylls på?

Medlem sedan juli 2009355 inlägg
#17

så här ser koden ut för att skriva ut raden med dropdownlistan och några textboxar för user input:

#region Add row
            
                trRow = new TableRow();
                tcCell = new TableCell();
                ddlArticleList = new DropDownList();
                ddlArticleList.CausesValidation = false;

                tcCell = new TableCell();
                btnButton = new Button();
                btnButton.ID = "btnInquiryArticleEdit";
                btnButton.Attributes.Add("style", "background-image:url(../Content/Images/add.png);");
                btnButton.Click += new EventHandler(btnInquiryArticleAdd_Click);
                btnButton.CssClass = "imgButton";
                btnButton.ToolTip = "Lägg till";
                btnButton.CausesValidation = true;
                tcCell.Controls.Add(btnButton);
                trRow.Cells.Add(tcCell);

                tcCell = new TableCell();
                
                    ddlArticleList.Attributes.Add("onKeyDown", "fnKeyDownHandler_A(this, event);");
                    ddlArticleList.Attributes.Add("onKeyUp", "fnKeyUpHandler_A(this, event); return false;");
                    ddlArticleList.Attributes.Add("onKeyPress", "return fnKeyPressHandler_A(this, event);");
                    ddlArticleList.Attributes.Add("onChange", "fnChangeHandler_A(this, event);");
                    ddlArticleList.ID = "ddlAddInquiryArticleArticle";
                    ddlArticleList.Items.Add("Ny_Artikel");

                    foreach (Article a in articles)
                    {
                        ddlArticleList.Items.Add(new ListItem(a.ArticleNumber, a.ID.ToString()));
                    }
                    tcCell.Controls.Add(ddlArticleList);
                    trRow.Cells.Add(tcCell);
                
                tcCell = new TableCell();
                tbBox = new TextBox();
                tbBox.ID = "txtAddInquiryArticleTerm";
                tcCell.Controls.Add(tbBox);
                trRow.Cells.Add(tcCell);
                tcCell = new TableCell();
                tbBox = new TextBox();
                tbBox.ID = "txtAddInquiryArticlePcs";
                tcCell.Controls.Add(tbBox);
                trRow.Cells.Add(tcCell);
                tcCell = new TableCell();
                tbBox = new TextBox();
                tbBox.ID = "txtAddInquiryArticleSuborder";
                tcCell.Controls.Add(tbBox);
                trRow.Cells.Add(tcCell);
                tcCell = new TableCell();
                tbBox = new TextBox();
                tbBox.ID = "txtAddInquiryArticleRevnumber";
                tcCell.Controls.Add(tbBox);
                trRow.Cells.Add(tcCell);

                foreach (Supplier s in lstSuppliers)
                {
                    trRow.Cells.Add(new TableCell());
                }
                if (lstSuppliers.Count < 4)
                {
                    for (int i = 0; i < 4 - lstSuppliers.Count; i++)
                    {
                        trRow.Cells.Add(new TableCell());
                    }
                }

                trRow.Visible = !ShowEditRow;
                InquiryTableArticles.Rows.Add(trRow);
                // ddlArticleList.TextChanged += new EventHandler(ddlArticleList_TextChanged);
            
            #endregion

vart ska man klämma in "!isPostBack" ??

Mvh Sanji

Medlem sedan juli 2009355 inlägg
#18

nu har jag testat runt lite, men hittils har jag bara fått felmeddelanden när jag sätter ut !isPostback, beroende på vart jag sätter den så är det olika meddelanden. kanske är det någon som har ett tips för var jag kan sätta den, eller hur jag kan göra om koden så att det fungerar? :)

Mvh. Sanji

Medlem sedan juli 2009355 inlägg
#19

Nu när jag försöker köra min stored procedure så klagar applikationen på:
"Conversion failed when converting from a character string to uniqueidentifier"

Slänger upp koden för att köra SP'n:

Article tempart = new Article();
                    tempart.ArticleNumber = ((TextBox)InquiryTableArticles.FindControl("lstDropDown_Textbox")).Text;
                    tempart.Term = ((TextBox)InquiryTableArticles.FindControl("txtAddInquiryArticleTerm")).Text;
                    SqlConnection conn = new SqlConnection("Data Source=.\\SQLExpress;Integrated Security=true; AttachDbFilename=|DataDirectory|\\databas.mdf;User Instance=true;");
                    SqlCommand cmd = new SqlCommand("AddArticles_InqArticles", conn);
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.Add(new SqlParameter("@companyID", currentUser.CompanyID));
                    cmd.Parameters.Add(new SqlParameter("@articlenr", tempart.ArticleNumber));
                    cmd.Parameters.Add(new SqlParameter("@term", tempart.Term));
                    cmd.Parameters.Add(new SqlParameter("@description", ""));

                    cmd.Parameters.Add(new SqlParameter("@inquiryID", Dropdownlistinquiries.SelectedValue));
                    cmd.Parameters.Add(new SqlParameter("@notice", 1));
                    cmd.Parameters.Add(new SqlParameter("@revnr", ((TextBox)InquiryTableArticles.FindControl("txtAddInquiryArticleRevnumber")).Text));
                    cmd.Parameters.Add(new SqlParameter("@pieces", ((TextBox)InquiryTableArticles.FindControl("txtAddInquiryArticlePcs")).Text));
                    cmd.Parameters.Add(new SqlParameter("@suborder", ((TextBox)InquiryTableArticles.FindControl("txtAddInquiryArticleSuborder")).Text));
                    cmd.Parameters.Add(new SqlParameter("@articletext", ""));

                    conn.Open();
                    cmd.ExecuteNonQuery();
                    conn.Close();
                    RefreshTable();

Här är SP'n:

ALTER PROCEDURE AddArticles_InqArticles
(
@companyID uniqueidentifier,
@articlenr varchar(50),
@term varchar(50),
@description varchar(MAX),

@inquiryID uniqueidentifier,
@notice int,
@revnr varchar(30),
@pieces varchar(13),
@suborder varchar(13),
@articletext varchar(MAX)
)
AS
BEGIN
set @description = ''
declare @ID uniqueidentifier
SELECT @ID = newid()
declare @inquiryartID uniqueidentifier
SELECT @inquiryartID = newid()
insert into article(ID,companyID,articlenr,term,description)Values(@ID,@companyID,@articlenr,@term,@description)
insert into inquiryarticles(inquiryartID,articleID,inquiryID,revnr,pieces,suborder,notice,articletext)VALUES(@inquiryartID,@ID,@inquiryID,@revnr,@pieces,@suborder,@notice,@articletext)
END

var är den här stringen som inte kan konverteras till Guid/uniqueidentifier?

mvh Sanji

Medlem sedan jan. 20023 327 inlägg
#20

CompanyID är av typen Guid?

cmd.Parameters.Add(new SqlParameter("@companyID", currentUser.CompanyID));

Tror du behöver korrigera parametern för @inquiryID enligt nedan:

cmd.Parameters.Add(new SqlParameter("@inquiryID", (Guid)Dropdownlistinquiries.SelectedValue));
157 ms totalt · 3 externa anrop · v20260731065814-full.b746b907
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
154 ms — hämta tråd, inlägg och bilagor (db)