При наведении курсора на сетку я хотел бы отобразить данные строки в другой метке - PullRequest
0 голосов
/ 29 августа 2011

Я хотел бы отобразить детали строки сетки в другой панели, когда пользователь наводит курсор на строку. Я сомневаюсь, что это возможно с помощью кода, поэтому я использую javascript.

для этого простого примера, я хотел бы отобразить идентификатор и имя пользователя в «lblIdDetail» и «lblNameDetail», когда строка наведена поверх:

 <asp:GridView ID="GridView1" runat="server" EnableModelValidation="True" AutoGenerateColumns="false">
        <Columns>
            <asp:TemplateField>
                <ItemTemplate>
                    <asp:Label ID="lblId" Text=<%# Bind("id") %> runat="server"></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField>
                <ItemTemplate>
                    <asp:Label ID="lblName" Text=<%# Bind("name") %> runat="server"></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>
    <asp:Panel ID="pnlDetails" runat="server">
        <asp:Label ID="Label1" runat="server" Text="The hovered Id is: "></asp:Label>
        <asp:Label ID="lblIdDetail" runat="server" Text="Label"></asp:Label>
        <br />
        <asp:Label ID="Label3" runat="server" Text="The hovered name is: "></asp:Label>
        <asp:Label ID="lblNameDetail" runat="server" Text="Label"></asp:Label>
    </asp:Panel>

Чтобы заполнить сетку фиктивными данными:

   protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            DataTable sampleData = new DataTable();
            sampleData.Columns.Add("id");
            sampleData.Columns.Add("name");


            sampleData.Rows.Add("1", "Dave");
            sampleData.Rows.Add("2", "John");
            sampleData.Rows.Add("3", "Jacob");
            sampleData.Rows.Add("4", "Smith");

            GridView1.DataSource = sampleData;
            GridView1.DataBind();
        }
    }

Я очень неопытен в использовании javascript, поэтому я был бы признателен за максимально подробный ответ. Спасибо: -)

Ответы [ 2 ]

2 голосов
/ 30 августа 2011

Вы можете добавить событие наведения мыши в событии RowDataBound, например:

//pass the needed row contens into showContents
e.Row.Attributes["onmouseover"] = "showContents(arg1, arg2, arg3)"; 

Я бы добавил ключи данных для столбцов, которые вы хотите отобразить в метках, вытащил значения в событии RowDataBound,и передайте их в функцию showContents JS.

1 голос
/ 30 августа 2011

С помощью Джейм я собрал функциональность, которую искал. Приведенный пример кода заполнит сетку с данными, некоторые видимые, некоторые скрытые. при наведении курсора на строку ниже будут отображаться скрытые данные, используемые для отображения более подробной информации, чем в виде сетки:

<script type="text/javascript">

window.onload = hideColumns;

    function hideColumns() {
    var gv = document.getElementById("GridView1");
    for (var i = 0; i < gv.rows.length; i++) {
        gv.rows[i].cells[1].style.display = "none";
    }
}

function showContents(rowIndex) {


    var gv = document.getElementById("GridView1");
    var rowElement = gv.rows[rowIndex];
    var id = rowElement.cells[0].innerHTML;
    document.getElementById('lblIdDetail').innerHTML = id;
    var name = rowElement.cells[1].innerHTML;
    document.getElementById('lblNameDetail').innerHTML = name;

}
</script>

<form id="form1" runat="server">
<div>
    <asp:GridView ID="GridView1" runat="server" EnableModelValidation="True" 
        AutoGenerateColumns="false" OnRowDataBound="setMouseover">
        <Columns>
            <asp:TemplateField>
                <ItemTemplate>
                    <asp:Label ID="lblId" Text="<%# Bind('id') %>" runat="server"></asp:Label>
                    <asp:Label ID="lblGreeting" Text="hello" runat="server" Visible="false" ></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField >
                <ItemTemplate>
                    <asp:Label ID="lblName" Text="<%# Bind('name') %>" runat="server" ></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>
    <asp:Panel ID="pnlDetails" runat="server">
        <asp:Label ID="Label1" runat="server" Text="The hovered Id is: "></asp:Label>
        <asp:Label ID="lblIdDetail" runat="server" Text="Label"></asp:Label>
        <br />
        <asp:Label ID="Label3" runat="server" Text="The hovered name is: "></asp:Label>
        <asp:Label ID="lblNameDetail" runat="server" Text="Label"></asp:Label>
    </asp:Panel>
</div>
</form>

  protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            DataTable sampleData = new DataTable();
            sampleData.Columns.Add("id");
            sampleData.Columns.Add("name");


            sampleData.Rows.Add("1", "Dave");
            sampleData.Rows.Add("2", "John");
            sampleData.Rows.Add("3", "Jacob");
            sampleData.Rows.Add("4", "Smith");

            GridView1.DataSource = sampleData;
            GridView1.DataBind();


        }
    }

    protected void setMouseover(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowIndex != -1)
        {
            e.Row.Attributes["onmouseover"] = "showContents('" + (e.Row.RowIndex +1)+ "')";

        }
    }
...