سؤال

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

في RowCreated الحدث علي السطر التالي:

e.Row.Attributes.Add(
     "onClick",
     ClientScript.GetPostBackClientHyperlink(
          this.grdSearchResults, "Select$" + e.Row.RowIndex));

لمنع رسائل الخطأ لدي هذا الكود:

protected override void Render(HtmlTextWriter writer)
{
    // .NET will refuse to accept "unknown" postbacks for security reasons. 
    // Because of this we have to register all possible callbacks
    // This must be done in Render, hence the override
    for (int i = 0; i < grdSearchResults.Rows.Count; i++)
    {
        Page.ClientScript.RegisterForEventValidation(
                new System.Web.UI.PostBackOptions(
                    grdSearchResults, "Select$" + i.ToString()));
    }
    // Do the standard rendering stuff
    base.Render(writer);
}

كيف يمكنني إعطاء صف واحد معرف فريد (من DB) و عندما اضغط على التوالي آخر يتم فتح الصفحة (مثل النقر على a href) و هذه الصفحة يمكن قراءة بطاقة الهوية.

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

المحلول

ولدي الحل.

وهذا ما قمت به:

if(e.Row.RowType == DataControlRowType.DataRow)
{
    e.Row.Attributes["onClick"] = "location.href='view.aspx?id=" + DataBinder.Eval(e.Row.DataItem, "id") + "'";
}

ولقد مبيكى رمز السابق في حال RowDataBound.

نصائح أخرى

"مارتن",

هنا مثال آخر مع بعض أنيق الصف وتسليط الضوء على a href style cursor:

protected void gvSearch_RowDataBound(object sender, GridViewRowEventArgs e)
{
  if (e.Row.RowType == DataControlRowType.DataRow)
  {
    e.Row.Attributes.Add("onmouseover", "this.style.backgroundColor='#ceedfc'");
    e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor=''");
    e.Row.Attributes.Add("style", "cursor:pointer;");
    e.Row.Attributes.Add("onclick", "location='patron_detail.aspx?id=" + e.Row.Cells[0].Text + "'");
  }
}

تعمل التعليمة البرمجية المذكورة أعلاه في .NET framework 3.5.ومع ذلك, لا يمكنك تعيين معرف العمود مرئية="false" لأنك سوف تحصل على فارغة سلسلة الاستعلام قيمة id الخاص بك الرئيسية:

<asp:GridView ID="gvSearch" runat="server" OnRowDataBound="gvSearch_RowDataBound" AutoGenerateColumns="false">
  <Columns>
    <asp:BoundField DataField="id" Visible="false" />
    <asp:BoundField DataField="first_name" HeaderText="First" />
    <asp:BoundField DataField="last_name" HeaderText="Last" />
    <asp:BoundField DataField="email" HeaderText="Email" />
    <asp:BoundField DataField="state_name" HeaderText="State" />
  </Columns>
</asp:GridView>

حتى تغيير العمود الأول إلى هذا بدلا من ذلك:

<asp:BoundField DataField="id" ItemStyle-CssClass="hide" />

هذا إضافة css الجزء العلوي من الصفحة الخاصة بك:

<head>
  <style type="text/css">
    .hide{
      display:none;
    }
  </style>
<head>

ولكن لإخفاء الخلية الأولى من رأس التوالي ، إضافة إلى هذا gvSearch_RowDataBound() في التعليمات البرمجية-خلف:

if (e.Row.RowType == DataControlRowType.Header)
{
  e.Row.Cells[0].CssClass = "hide";
}

من الواضح أنك يمكن أن يكون مخفي الهوية عمود في التعليمات البرمجية-خلف أيضا ، ولكن هذه النتيجة في أكثر من نص في توصيف من فئة css:

e.Row.Cells[0].Attributes.Add("style", "display:none;");
e.Row.Attributes.Add("style", "cursor:pointer;");

protected void gvSearch_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        string abc = ((GridView)sender).DataKeys[e.Row.RowIndex].Value.ToString();
        e.Row.Attributes["onClick"] = "location.href='Default.aspx?id=" + abc + "'";    
    }
}
protected void gvSearch_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
        string abc = ((GridView)sender).DataKeys[e.Row.RowIndex].Value.ToString(); 
        e.Row.Attributes["onClick"] = "location.href='Default.aspx?id=" + abc + "'";     
    } 
} 
protected void gvSearch_RowDataBound(object sender, GridViewRowEventArgs e)  
{     
 if (e.Row.RowType == DataControlRowType.DataRow)
        {
            GridViewRow gvr = e.Row;
            string abc = ((GridView)sender).DataKeys[e.Row.RowIndex].Value.ToString();         
            gvr.Attributes.Add("OnClick", "javascript:location.href='Default.aspx?id=" + abc + "'");
        }         

   }  
}  

ويمكن أن تكون ذات صلة ID الخاص بك إلى العنصر البيانات المعروضة في gridview؟

وإذا كان الأمر كذلك يمكنك استخدام e.Row.DataItem، ويطرح للأي نوع كان.

ويمكنك استخدام الحدث RowCommand من وجهة نظر الشبكة لذلك. في زر / صلتك حيث كنت wnat لضبط الضغط على تعيين CommandName وCommandArgument، والتي يمكنك accees في المعلمتين EventArgs للأسلوب الحدث.

والصف انقر في عرض الشبكة إعادة توجيه إلى صفحة أخرى

    protected void gvSearch_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
             string abc = ((GridView)sender).DataKeys[e.Row.RowIndex].Value.ToString();
             e.Row.Attributes["onClick"] = "location.href='Default.aspx?id=" + abc + "'";
        }
    }

ويعمل بشكل جيد للغاية

وJohnB، التعليمات البرمجية الخاصة بك يعمل بشكل جيد جدا، أنا فقط واضاف قليلا الإختراق لتجنب alternatingRowStyle تخريب بعد mouseout.

e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor=''");

وتغيير ما يلي:

e.Row.Attributes.Add("onmouseout", "if(" + e.Row.RowIndex + "% 2 == 0) { this.style.backgroundColor=''; } else { this.style.backgroundColor = '#E8F7EA'; }");

إذا هناك طريقة أفضل للقيام بذلك، واسمحوا لي أن أعرف، ولكن انها تعمل مثاليا بالنسبة لي.

وتحية.

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