تمرير وسيطة متعددة من خلال CommandArgument of Button في ASP.NET

StackOverflow https://stackoverflow.com/questions/2389258

سؤال

لديّ GridView مع صفوف متعددة ، لكل منهما زر تحديث وأحتاج إلى تمرير قيمتين عندما ينقر شخص ما على زر التحديث. بصرف النظر عن تعبئة الحجج داخل CommandArgument مفصولة بفواصل (قديمة وليست أنيقة) ، كيف يمكنني اجتياز أكثر من حجة واحدة؟

<asp:LinkButton ID="UpdateButton" runat="server" CommandName="UpdateRow" CommandArgument="arg_value" Text="Update and Insert" OnCommand="CommandButton_Click" ></asp:LinkButton>

كملاحظة ، لا يمكن استرداد القيم من أي عناصر تحكم في الصفحة ، لذلك لا أسعى حاليًا إلى أي حلول تصميم.

هل كانت مفيدة؟

المحلول

بعد أن بدس حوله يبدو أن كيلسي صحيح.

ما عليك سوى استخدام فاصلة أو شيء ما وقم بتقسيمه عندما تريد استهلاكه.

نصائح أخرى

يمكنك تمرير القيم المنفصلة المنقوطة كوسيطة أو ثم تقسيم السلسلة واستخدامها.

<asp:TemplateField ShowHeader="false">
    <ItemTemplate>
       <asp:LinkButton ID="lnkCustomize" Text="Customize"  CommandName="Customize"  CommandArgument='<%#Eval("IdTemplate") + ";" +Eval("EntityId")%>'  runat="server"> 
       </asp:LinkButton>   
    </ItemTemplate>   
</asp:TemplateField>

في جانب الخادم

protected void gridview_RowCommand(object sender, GridViewCommandEventArgs e)
{
      string[] arg = new string[2];
      arg = e.CommandArgument.ToString().Split(';');
      Session["IdTemplate"] = arg[0];
      Session["IdEntity"] = arg[1];
      Response.Redirect("Samplepage.aspx");
}

أتمنى أن يساعد !!!!

إجابة باتريك فكرة جيدة ، وتستحق المزيد من الائتمان!. يمكنك الحصول على أكبر عدد من عناصر البيانات التي تريدها ، يتم فصلها جميعًا ، ويمكن استخدامها جانب العميل إذا لزم الأمر.

يمكن أيضًا إضافتها بشكل إعلاني وليس في الكود. لقد فعلت هذا للتو من أجل Gridview مثل هذا:

<asp:TemplateField HeaderText="Remind">
  <ItemTemplate>
    <asp:ImageButton ID="btnEmail"  
        data-rider-name="<%# ((Result)((GridViewRow) Container).DataItem).Rider %>"
        data-rider-email="<%# ((Result)((GridViewRow) Container).DataItem).RiderEmail %>"
        CommandName="Email" runat="server" ImageAlign="AbsMiddle" ImageUrl="~/images/email.gif" />
  </ItemTemplate> 
</asp:TemplateField>

في Rowcommand ، يمكنك القيام بذلك:

void gvMyView_RowCommand(object sender, GridViewCommandEventArgs e)
{
    if (e.CommandName == "Email")
    {
        var btnSender = (ImageButton)e.CommandSource;
        var riderName = btnSender.Attributes["data-rider-name"];
        var riderEmail = btnSender.Attributes["data-rider-email"];
        // Do something here
    }
}

أنظف كثيرًا من اختراق جميع القيم مع المحددات والتفريغ مرة أخرى في النهاية.

لا تنسى اختبار/تنظيف أي بيانات تعود إليها من الصفحة ، في حالة العبث بها!

نهج بلدي هو استخدام مجموعة السمات لإضافة سمات بيانات HTML من الكود وراء. هذا هو أكثر في خط مع jQuery والبرمجة النصية من جانب العميل.

// This would likely be done with findControl in your grid OnItemCreated handler
LinkButton targetBtn = new LinkButton();


// Add attributes
targetBtn.Attributes.Add("data-{your data name here}", value.ToString() );
targetBtn.Attributes.Add("data-{your data name 2 here}", value2.ToString() );

ثم استرجع القيم من خلال مجموعة السمات

string val = targetBtn.Attributes["data-{your data name here}"].ToString();

طريقة أكثر أناقة قليلا لفعل الشيء نفسه إضافة إلى التعليق أعلاه ..

<asp:GridView ID="grdParent" runat="server" BackColor="White" BorderColor="#DEDFDE"
                           AutoGenerateColumns="false"
                            OnRowDeleting="deleteRow"
                         GridLines="Vertical">
      <asp:BoundField DataField="IdTemplate" HeaderText="IdTemplate" />
      <asp:BoundField DataField="EntityId" HeaderText="EntityId"  />
    <asp:TemplateField ShowHeader="false">
        <ItemTemplate>
           <asp:LinkButton ID="lnkCustomize" Text="Delete"  CommandName="Delete"  CommandArgument='<%#Eval("IdTemplate") + ";" +Eval("EntityId")%>'  runat="server"> 
           </asp:LinkButton>   
        </ItemTemplate>   
    </asp:TemplateField>
     </asp:GridView>

وعلى جانب الخادم:

protected void deleteRow(object sender, GridViewDeleteEventArgs e)
{
    string IdTemplate= e.Values["IdTemplate"].ToString();
    string EntityId = e.Values["EntityId"].ToString();

   // Do stuff..
}

إما تخزينها في مجموعة Dataakeys GridView ، أو تخزينها في حقل مخفي داخل نفس الخلية ، أو انضم إلى القيم معًا. هذا هو السبيل الوحيد. لا يمكنك تخزين قيمتين في رابط واحد.

إذا كنت تريد المرور قيمتان, ، يمكنك استخدام هذا النهج

<asp:LinkButton ID="RemoveFroRole" Text="Remove From Role" runat="server"
CommandName='<%# Eval("UserName") %>' CommandArgument='<%# Eval("RoleName") %>'
 OnClick="RemoveFromRole_Click" />

في الأساس ، أنا أتعامل مع {commmandname ، commandArgument} كقيمة مفتاح. تعيين كلاهما من حقل قاعدة البيانات. سيكون عليك استخدام حدث Onclick والاستخدام OnCommand الحدث في هذه الحالة ، والذي أعتقد أنه رمز أكثر نظافة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top