كيف يمكنني إضافة زر برمجيا إلى GridView وتعيينه إلى وظيفة رمز محددة وراء؟

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

سؤال

في وقت التشغيل، أقوم بإنشاء DataTable واستخدام متداخل حلقات لملء الجدول. يقوم هذا الجدول في وقت لاحق بتعيين بيانات DataSource إلى GridView وعلى rowdatabound أعتزم قيمة كل خلية. أريد أن أعرف كيف يمكنني منح كل خلية زر واحدة وتعيين هذا الزر إلى وظيفة CodeBehind. سآخذ 12 أزرارا وكل منها سيحتوي على قيمة مختلفة. أفضل ما إذا قاموا جميعا باستدعاء نفس الوظيفة مع نوع من الحدث الذي يخزن قيمة الخلية الخاصة.

هذا هو الرمز حيث يتم إنشاء الجدول:

protected void GridViewDice_RowDataBound(object sender, GridViewRowEventArgs e)
{


    DataTable diceTable = _gm.GetDice(_gameId);
    for (int i = 0; i < GameRules.ColumnsOfDice; i++)
    {
        if(e.Row.RowIndex > -1)
        {
            /*This is where I'd like to add the button*/
            //e.Row.Cells[i].Controls.Add(new Button);
            //e.Row.Cells[i].Controls[0].Text = specific value from below

            //This is where the specific value gets input
            e.Row.Cells[i].Text = diceTable.Rows[e.Row.RowIndex][i].ToString();
        }

    }
}

أرغب في التعامل مع ButtonClick مع شيء مثل هذا:

protected void DiceButton_Click(int column, int row, int value)
{
    //Do whatever
}

أي اقتراحات؟

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

المحلول

على GridView الخاص بك في العلامات، قم بتعيين سمة Commandargument إلى أيهما تريد (هنا اخترت فهرس GridViewrow الحالي) داخل الأزرار الخاصة بك.

 <asp:Button ID="lbnView" runat="server" Text="Button" OnClick="btn_Clicked" 
CommandArgument="<%# ((GridViewRow)Container).RowIndex %>"></asp:Button>

أو في الكود الخاص بك، يمكنك إنشاء زر مثل أدناه

protected void GridViewDice_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 


    DataTable diceTable = _gm.GetDice(_gameId); 
    for (int i = 0; i < GameRules.ColumnsOfDice; i++) 
    { 
        if(e.Row.RowIndex > -1) 
        { 
            Button btn = new Button();
            btn.CommandArgument = diceTable.Rows[e.Row.RowIndex][i].ToString(); 
            btn.Attributes.Add("OnClick", "btn_Clicked");

            e.Row.Cells[i].Controls.Add(btn);
        }
    }
}

ثم جعل معالج حدث مثل أدناه

protected void btn_Clicked(object sender, EventAgrs e)
{
   //get your command argument from the button here
   if (sender is Button)
   {
     try
     {
        String yourAssignedValue = ((Button)sender).CommandArgument;
     }
     catch
     {
       //Check for exception
     }
   }
}

نصائح أخرى

لسوء الحظ في تلك المرحلة، لا يمكنك إنشاء زر جديد وتعيين الأحداث إليه. بواسطة هذه النقطة في دورة حياة الصفحة، عندما تقوم بإطلاق الأحداث، فقد قامت بالفعل بتكييف قائمة عناصر التحكم "المعروفة" التي ستواصلها تتبعها عند إعادة تحميل الصفحة، وبالتالي لن تعرف إطلاق النار على رمز الحدث الخاص بك في المرة القادمة التي تنشرها مرة أخرى.

من أجل الحصول على ASP.NET لإطلاق أساليب الحدث الخاصة بك بشكل صحيح، تحتاج إلى إضافة عنصر تحكم الزر إلى التسلسل الهرمي للتحكم في الصفحة قبل حدث تحميل الصفحة. عادة ما أفعل ذلك في حدث INIT أو طريقة Createchildcontrols.

لحل مشكلتك، أود أن أوصي بإضافة الزر إلى جميع الخلايا في علامة القالب ولديه مرجع معالج الأحداث هناك. بعد ذلك، قم بإجراء مقبض طريقة ROWDATATABOUND الخاصة بك بوضوح الزر أو إيقاف تشغيله.

إن أسهل طريقة للقيام بذلك هي إضافة عمود إلى GridView الخاص بك (يمكنك استخدام زر بدلا من ارتباط تشعبي إذا كنت تحب):

<Columns>
 <asp:HyperLinkField DataNavigateUrlFields="ID" DataNavigateUrlFormatString="~/pUser.aspx?field={0}" HeaderText="Select" Text="Select" />

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