webForumDet fria alternativet

problem med RadioButton i GridView

10 svar · 577 visningar · startad av Vinnaren

VinnarenMedlem sedan sep. 2005833 inlägg
#1

Har GridView:n:

    <asp:GridView 
        DataKeyNames="PayId" 
        ID="gvPayWay" 
        runat="server" 
        AutoGenerateColumns="False" 
        AllowPaging="false" 
        CssClass="gvPayWay"  
        GridLines="None"     
        AllowSorting="false" 
        EmptyDataText="Det finns inga betalsätt att välja mellan" 
        DataSourceID="PayWayObjectDataSource">
        <Columns>
            <asp:TemplateField HeaderText="Betalsätt">
                <ItemTemplate>
                    <label>
                        <asp:RadioButton ID="rbtnPayWay" GroupName="PayWay" runat="server" />
                        <asp:Label ID="Label1" runat="server" Text='<%#Eval("Name") %>' />
                    </label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Kostnad">
                <ItemTemplate>
                    <asp:Label ID="Label2" runat="server" Text='<%#Eval("Price") %>' />
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>    
    </asp:GridView>
    
    <asp:Button ID="btnPayWay" runat="server" Text="Vidare" />

Nu vill jag antingen direkt när man klickar i RadioButton eller när man klickar på knappen btnPayWay skapa en session innehållande PayId för den RadioButton som är markerad.

Hör löser man detta??

Tacksam för aää hjälp :stud

CatZMedlem sedan jan. 20022 440 inlägg
#2

du får lägga till ett command.

<asp:RadioButton ID="rbtnPayWay" GroupName="PayWay" runat="server" CommandName="myCommand" CommandArgument='<%#Eval("PayID") %>' OnCommand="ExecuteTheCommand"/>

Sedan i code behind

protected void ExecuteTheCommand(object sender, CommandEventArgs e)
{
    Session("PayID") = e.CommandArgument;
}
VinnarenMedlem sedan sep. 2005833 inlägg
#3

tack, men det fungerar inte, händer ingenting dvs Session får inget värde.

Finns OnCommand, CommandName, CommandArgument på RadioButton? Får inte upp dem i egenskaperna på kontrollen.

Måste väll gå att lösa på något sätt? :stud

MikeEastMedlem sedan sep. 200153 inlägg
#4

Det tråkiga med CatZ förslag är att RadioButton inte implementerar IButtonControl, som t.ex. Button gör. Det finns helt enkelt ingen property som heter CommandName på RadioButton.

Mitt förslag är tyvärr lite småsunkigt, men jag kommer inte på något bättre just nu:

<asp:TemplateField HeaderText="Betalsätt">
    <ItemTemplate>
        <label>
            <asp:RadioButton ID="rbtnPayWay" GroupName="PayWay" runat="server" AutoPostBack="true" OnCheckedChanged="rbtnPayWay_CheckedChanged" />
            <asp:Label ID="Label1" runat="server" Text='<%#Eval("Name") %>' />
            <asp:label runat="server" id="lblPayId" Text='<%# Eval("PayId") %>' Visible="False" />
        </label>
    </ItemTemplate>
</asp:TemplateField>

code-behind:

protected void rbtnPayWay_CheckedChanged(object sender, EventArgs e)
{
    RadioButton rb = sender as RadioButton;
    if(rb == null)
        return;

    // Om kontrollen du vill åt ligger i samma "cell" (samma templatefield)
    DataControlFieldCell cell = rb.Parent as DataControlFieldCell;
    if(cell == null)
        return;

    // Om kontrollen du vill åt ligger på samma rad, men i ett annat templatefield
    // eller om du vill komma åt dataItem för raden. Det innebär dock att GridView 
    // måste vara databound (row.DataItem)
    //GridViewRow row = rb.Parent.Parent as GridViewRow;
    //if (row != null)
    //    return;

    Label lblPayId = cell.FindControl("lblPayId") as Label;
    if(lblPayId == null)
        return;

    int payId;
    Int32.TryParse(lblPayId.Text, out payId);

    Session["PayId"] = payId;
}

Det känns alltid som om man gör något fel när man börjar navigera uppåt med .Parent, men jag tror att detta kan funka ganska bra ändå.

::m

CatZMedlem sedan jan. 20022 440 inlägg
#5

precis, kolla på egenskaperna för knappen så hittar du nog något som passar :) Det jag skrev är för en linkbutton.

OnClick kanske fungerar...

VinnarenMedlem sedan sep. 2005833 inlägg
#6

tack, men ingenting händer när jag klickar i en av RadioButton, den går inte in i rbtnPayWay_CheckedChanged (inget felmeddelande).

kan det vara för fel? :stud

MikeEastMedlem sedan sep. 200153 inlägg
#7

Det låter lite konstigt.

- Har alla inblandade kontroller runat="server"?
- Är rbtnPayWay_CheckedChanged public eller protected?
- Har du kompilerat om?

Kan du posta din nya kod kanske..?

::m

VinnarenMedlem sedan sep. 2005833 inlägg
#8

ok, men märkte nu när jag la in en rad till i databasen att man kan markera två RadioButton, hur löser man det så endast en kan vara markerad?

Har följande:

    <asp:GridView 
        DataKeyNames="PayId" 
        ID="gvPayWay" 
        runat="server" 
        AutoGenerateColumns="False" 
        AllowPaging="false" 
        CssClass="gvPayWay"  
        GridLines="None"     
        AllowSorting="false" 
        EmptyDataText="Det finns inga betalsätt att välja mellan" 
        DataSourceID="PayWayObjectDataSource">
        <Columns>
            <asp:TemplateField HeaderText="Betalsätt">
                                <ItemTemplate>
                    <asp:RadioButton 
                        ID="rbtnPayWay" 
                        GroupName="PayWay" 
                        ToolTip="Välj betalningsalternativ"  
                        Text='<%#Eval("Name") %>'                            
                        runat="server" 
                        oncheckedchanged="rbtnPayWay_CheckedChanged" />
                    <asp:label runat="server" id="lblPayId" Text='<%# Eval("PayId") %>' Visible="False" />
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Kostnad">
                <ItemTemplate>
                    <asp:Label ID="Label2" runat="server" Text='<%#Eval("Price") %>' />
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>    
    </asp:GridView>
    
    <asp:Button ID="btnPayWay" runat="server" Text="Vidare" />

samt:

    protected void rbtnPayWay_CheckedChanged(object sender, EventArgs e)
    {
        RadioButton rb = (RadioButton)sender;
        if (rb == null)
            return;

        // Om kontrollen du vill åt ligger i samma "cell" (samma templatefield)
        DataControlFieldCell cell = (DataControlFieldCell)rb.Parent;
        if (cell == null)
            return;

        // Om kontrollen du vill åt ligger på samma rad, men i ett annat templatefield
        // eller om du vill komma åt dataItem för raden. Det innebär dock att GridView 
        // måste vara databound (row.DataItem)
        //GridViewRow row = rb.Parent.Parent as GridViewRow;
        //if (row != null)
        //    return;

        Label lblPayId = (Label)cell.FindControl("lblPayId");
        if (lblPayId == null)
            return;

        int payId;
        Int32.TryParse(lblPayId.Text, out payId);
        
        Session["PayId"] = payId;

    }
VinnarenMedlem sedan sep. 2005833 inlägg
#9

det löste sig med:

            foreach (GridViewRow gv in gvPayWay.Rows)
            {
                RadioButton rbtnPayWay = (RadioButton)gv.FindControl("rbtnPayWay");
                Label lblPayId = (Label)gv.FindControl("lblPayId");

                if (rbtnPayWay.Checked)
                {
                    int payid = Convert.ToInt32(lblPayId.Text);
                    Session["PayId"] = payid;
                }
            }

Men hur ställer man in på RadioButton att man endast ska kunna markera en? SOm jag har det nu kan man markera flera. :q :stud

CatZMedlem sedan jan. 20022 440 inlägg
#10

då måste alla ha samma id eller tillhöra samma grupp

VinnarenMedlem sedan sep. 2005833 inlägg
#11

ok, har ju satt följande egenskaper:

ID="rbtnPayWay" 
                        GroupName="PayWay"

men det funkar inte :stud :q

139 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)